<div dir="ltr"><div><div>Please disregard this patch, it must be sent to Ginger list.<br><br></div>Tks<br><br></div>André Teodoro<br><div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jan 14, 2016 at 10:22 AM,  <span dir="ltr">&lt;<a href="mailto:andreteodoro.work@gmail.com" target="_blank">andreteodoro.work@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">From: Andre Teodoro &lt;<a href="mailto:andreteodoro.work@gmail.com">andreteodoro.work@gmail.com</a>&gt;<br>
<br>
Signed-off-by: Andre Teodoro &lt;<a href="mailto:andreteodoro.work@gmail.com">andreteodoro.work@gmail.com</a>&gt;<br>
---<br>
<span class=""> ui/config/tab-ext.xml                   |  23 +-<br>
 ui/css/ginger.css                       | 209 +++++++-<br>
 ui/css/src/ginger.scss                  |  70 ++-<br>
 ui/css/src/modules/_sysmodules.scss     | 126 +++++<br>
 ui/js/host-sysmodules.js                |  76 +++<br>
 ui/js/util.js                           | 871 ++++++++++++++++----------------<br>
 ui/pages/tabs/host-sysmodules.html.tmpl |  88 ++++<br>
 7 files changed, 1012 insertions(+), 451 deletions(-)<br>
 create mode 100644 ui/css/src/modules/_sysmodules.scss<br>
 create mode 100644 ui/js/host-sysmodules.js<br>
 create mode 100644 ui/pages/tabs/host-sysmodules.html.tmpl<br>
<br>
</span>diff --git a/ui/config/tab-ext.xml b/ui/config/tab-ext.xml<br>
index 2247666..f3efc95 100644<br>
--- a/ui/config/tab-ext.xml<br>
+++ b/ui/config/tab-ext.xml<br>
@@ -1,5 +1,5 @@<br>
 &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br>
-&lt;!--<br>
+    &lt;!--<br>
 Copyright IBM Corp, 2015<br>
<br>
 This library is free software; you can redistribute it and/or<br>
@@ -19,22 +19,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA<br>
 &lt;tabs-ext&gt;<br>
     &lt;functionality&gt;Host&lt;/functionality&gt;<br>
     &lt;tab&gt;<br>
-        &lt;access role=&quot;admin&quot; mode=&quot;admin&quot;/&gt;<br>
-        &lt;access role=&quot;user&quot; mode=&quot;none&quot;/&gt;<br>
+        &lt;access role=&quot;admin&quot; mode=&quot;admin&quot; /&gt;<br>
+        &lt;access role=&quot;user&quot; mode=&quot;none&quot; /&gt;<br>
         &lt;title&gt;Administration&lt;/title&gt;<br>
         &lt;path&gt;plugins/ginger/tabs/host-admin.html&lt;/path&gt;<br>
     &lt;/tab&gt;<br>
     &lt;tab&gt;<br>
-        &lt;access role=&quot;admin&quot; mode=&quot;admin&quot;/&gt;<br>
-        &lt;access role=&quot;user&quot; mode=&quot;none&quot;/&gt;<br>
+        &lt;access role=&quot;admin&quot; mode=&quot;admin&quot; /&gt;<br>
+        &lt;access role=&quot;user&quot; mode=&quot;none&quot; /&gt;<br>
         &lt;title&gt;Network&lt;/title&gt;<br>
         &lt;path&gt;plugins/ginger/tabs/host-network.html&lt;/path&gt;<br>
     &lt;/tab&gt;<br>
     &lt;tab&gt;<br>
-        &lt;access role=&quot;admin&quot; mode=&quot;admin&quot;/&gt;<br>
-        &lt;access role=&quot;user&quot; mode=&quot;none&quot;/&gt;<br>
-<br>
+        &lt;access role=&quot;admin&quot; mode=&quot;admin&quot; /&gt;<br>
+        &lt;access role=&quot;user&quot; mode=&quot;none&quot; /&gt;<br>
         &lt;title&gt;Storage&lt;/title&gt;<br>
         &lt;path&gt;plugins/ginger/tabs/host-storage.html&lt;/path&gt;<br>
     &lt;/tab&gt;<br>
-&lt;/tabs-ext&gt;<br>
+    &lt;tab&gt;<br>
+        &lt;access role=&quot;admin&quot; mode=&quot;admin&quot; /&gt;<br>
+        &lt;access role=&quot;user&quot; mode=&quot;none&quot; /&gt;<br>
+        &lt;title&gt;System Modules&lt;/title&gt;<br>
+        &lt;path&gt;plugins/ginger/tabs/host-sysmodules.html&lt;/path&gt;<br>
+    &lt;/tab&gt;<br>
+&lt;/tabs-ext&gt;<br>
\ No newline at end of file<br>
diff --git a/ui/css/ginger.css b/ui/css/ginger.css<br>
index 560fb3c..725366f 100644<br>
--- a/ui/css/ginger.css<br>
+++ b/ui/css/ginger.css<br>
@@ -153,7 +153,9 @@<br>
   background-color: #008abf;<br>
 }<br>
<br>
-.ginger .modal-body .nav-tabs &gt; li.active &gt; a, .ginger .modal-body .nav-tabs &gt; li.active &gt; a:hover, .ginger .modal-body .nav-tabs &gt; li.active &gt; a:focus {<br>
+.ginger .modal-body .nav-tabs &gt; li.active &gt; a,<br>
+.ginger .modal-body .nav-tabs &gt; li.active &gt; a:hover,<br>
+.ginger .modal-body .nav-tabs &gt; li.active &gt; a:focus {<br>
   border-color: -moz-use-text-color -moz-use-text-color #008abf;<br>
 }<br>
<br>
@@ -948,49 +950,60 @@<br>
 #form-nw-vlan-ipv4,<br>
 #form-nw-vlan-general,<br>
 #form-nw-vlan-ipv6,<br>
-#form-nw-vlan-advance {<br>
+#form-nw-vlan-advance,<br>
+#form-nw-bond-general,<br>
+#form-nw-bond-ipv4,<br>
+#form-nw-bond-ipv6,<br>
+#form-nw-bond-advance {<br>
   margin: 15px 0 0;<br>
   width: 98%;<br>
 }<br>
<br>
 #nw-settings-window .tab-content,<br>
-#nw-vlan-window .tab-content {<br>
+#nw-vlan-window .tab-content,<br>
+#nw-bond-window .tab-content {<br>
   height: 559px;<br>
   overflow: auto;<br>
 }<br>
<br>
 #nw-settings-window .tab-content .tab-pane,<br>
-#nw-vlan-window .tab-content .tab-pane {<br>
+#nw-vlan-window .tab-content .tab-pane,<br>
+#nw-bond-window .tab-content .tab-pane {<br>
   position: relative;<br>
 }<br>
<br>
 #nw-settings-tabs .form-horizontal .control-label,<br>
-#nw-vlan-tabs .form-horizontal .control-label {<br>
+#nw-vlan-tabs .form-horizontal .control-label,<br>
+#nw-bond-tabs .form-horizontal .control-label {<br>
   text-align: left;<br>
   padding-top: 0px;<br>
 }<br>
<br>
 #nw-settings-tabs .bootgrid-table,<br>
-#nw-vlan-tabs .bootgrid-table {<br>
+#nw-vlan-tabs .bootgrid-table,<br>
+#nw-bond-tabs .bootgrid-table {<br>
   height: 140px;<br>
   width: 99%;<br>
   margin-left: 1%;<br>
 }<br>
<br>
 #nw-settings-tabs .bootgrid-table th &gt; .column-header-anchor &gt; .icon,<br>
-#nw-vlan-tabs .bootgrid-table th &gt; .column-header-anchor &gt; .icon {<br>
+#nw-vlan-tabs .bootgrid-table th &gt; .column-header-anchor &gt; .icon,<br>
+#nw-bond-tabs .bootgrid-table th &gt; .column-header-anchor &gt; .icon {<br>
   right: 40%;<br>
 }<br>
<br>
 #nw-settings-tabs .bootgrid-table thead,<br>
-#nw-vlan-tabs .bootgrid-table thead {<br>
+#nw-vlan-tabs .bootgrid-table thead,<br>
+#nw-bond-tabs .bootgrid-table thead {<br>
   display: block;<br>
   width: 100%;<br>
   padding: 0;<br>
 }<br>
<br>
 #nw-settings-tabs .bootgrid-table tbody,<br>
-#nw-vlan-tabs .bootgrid-table tbody {<br>
+#nw-vlan-tabs .bootgrid-table tbody,<br>
+#nw-bond-tabs .bootgrid-table tbody {<br>
   height: 120px;<br>
   overflow: auto;<br>
   position: absolute;<br>
@@ -999,13 +1012,15 @@<br>
 }<br>
<br>
 #nw-settings-tabs .bootgrid-table tr,<br>
-#nw-vlan-tabs .bootgrid-table tr {<br>
+#nw-vlan-tabs .bootgrid-table tr,<br>
+#nw-bond-tabs .bootgrid-table tr {<br>
   width: 100%;<br>
   display: inline-table;<br>
 }<br>
<br>
 #nw-settings-tabs .bootgrid-table th,<br>
-#nw-vlan-tabs .bootgrid-table th {<br>
+#nw-vlan-tabs .bootgrid-table th,<br>
+#nw-bond-tabs .bootgrid-table th {<br>
   background-color: #eee;<br>
 }<br>
<br>
@@ -1251,3 +1266,175 @@<br>
   margin: 0;<br>
   width: 160px;<br>
 }<br>
+<br>
+#host-sysmodules-root-container .accordion {<br>
+  margin: 12px 20px 12px 60px;<br>
+  padding-bottom: 18px;<br>
+  border-bottom: 1px solid #eee;<br>
+  overflow: visible;<br>
+  clear: both;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion:first-chld {<br>
+  margin-top: 24px;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion &gt; h3 {<br>
+  margin: 0;<br>
+  padding: 0;<br>
+  font-size: 26px;<br>
+  font-weight: 300;<br>
+  height: 44px;<br>
+  display: block;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion &gt; h3 a {<br>
+  color: #3a393b;<br>
+  text-decoration: none;<br>
+  display: block;<br>
+  padding: 6px 30px;<br>
+  margin-left: -30px;<br>
+  margin-right: -30px;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion &gt; h3 a span.accordion-icon {<br>
+  margin-left: -52px;<br>
+  vertical-align: middle;<br>
+  display: inline-block;<br>
+  font: normal normal normal 32px/1 FontAwesome;<br>
+  text-rendering: auto;<br>
+  -webkit-font-smoothing: antialiased;<br>
+  color: #3a393b;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion &gt; h3 a[aria-expanded=&quot;false&quot;] span.accordion-icon:before {<br>
+  content: &quot;\f01a&quot;;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion &gt; h3 a[aria-expanded=&quot;true&quot;] span.accordion-icon:before {<br>
+  content: &quot;\f01b&quot;;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .accordion &gt; h3 a span.accordion-text {<br>
+  margin-left: 23px;<br>
+  display: inline-block;<br>
+  vertical-align: middle;<br>
+}<br>
+<br>
+#host-sysmodules-root-container .navbar-default.toolbar {<br>
+  background-color: #008abf !important;<br>
+}<br>
+<br>
+#sysmodules-content-area {<br>
+  padding: 0;<br>
+  list-style-type: none;<br>
+}<br>
+<br>
+#sysmodules-content-area .li:nth-child(even) {<br>
+  background-color: #fcfcfc;<br>
+}<br>
+<br>
+#sysmodules-content-area .li:nth-child(odd) {<br>
+  background-color: #fff;<br>
+}<br>
+<br>
+#sysmodules-content-area .header &gt; span,<br>
+#sysmodules-content-area .header &gt; div,<br>
+#sysmodules-content-area .body &gt; span,<br>
+#sysmodules-content-area .body &gt; div {<br>
+  padding: 6px 2px;<br>
+  display: inline-block;<br>
+  font-family: &quot;Open Sans&quot;, Helvetica, Arial, &quot;Lucida Grande&quot;, sans-serif;<br>
+}<br>
+<br>
+#sysmodules-content-area .header {<br>
+  border-top: 0 none;<br>
+}<br>
+<br>
+#sysmodules-content-area .header &gt; span,<br>
+#sysmodules-content-area .header &gt; div {<br>
+  vertical-align: bottom;<br>
+  height: 36px;<br>
+  font-weight: 300;<br>
+  font-size: 12.5pt;<br>
+  line-height: 1.42857;<br>
+  border-bottom: 0;<br>
+  border-top: 0;<br>
+}<br>
+<br>
+#sysmodules-content-area .body {<br>
+  border-top: 1px solid #eee;<br>
+}<br>
+<br>
+#sysmodules-content-area .body &gt; span,<br>
+#sysmodules-content-area .body &gt; div {<br>
+  vertical-align: middle;<br>
+  font-size: 11pt;<br>
+  line-height: 2.42857;<br>
+  font-weight: 400;<br>
+}<br>
+<br>
+#sysmodules-content-area .btn-group {<br>
+  margin-bottom: 20px;<br>
+}<br>
+<br>
+#sysmodules-content-area .column-name {<br>
+  width: 30%;<br>
+}<br>
+<br>
+#sysmodules-content-area .column-depends {<br>
+  width: 30%;<br>
+}<br>
+<br>
+#sysmodules-content-area .column-details {<br>
+  width: 12%;<br>
+  vertical-align: middle;<br>
+  text-align: center;<br>
+}<br>
+<br>
+#sysmodules-content-area .column-version {<br>
+  width: 14%;<br>
+}<br>
+<br>
+#sysmodules-content-area .column-actions {<br>
+  width: 14%;<br>
+}<br>
+<br>
+#sysmodules-content-area .sysmodules-details {<br>
+  width: 100%;<br>
+  padding: 22px;<br>
+  background: #ddd;<br>
+}<br>
+<br>
+#sysmodules-content-area .details-list {<br>
+  max-height: 285px;<br>
+  min-height: 140px;<br>
+  background: #fff;<br>
+  padding: 0;<br>
+  overflow-x: hidden;<br>
+  overflow-y: auto;<br>
+}<br>
+<br>
+#sysmodules-content-area .arrow-down,<br>
+#sysmodules-content-area .arrow-up {<br>
+  display: inline-block;<br>
+  font: normal normal normal 14px/1 FontAwesome;<br>
+  font-size: inherit;<br>
+  text-rendering: auto;<br>
+  -webkit-font-smoothing: antialiased;<br>
+  -moz-osx-font-smoothing: grayscale;<br>
+  cursor: pointer;<br>
+}<br>
+<br>
+#sysmodules-content-area .arrow-down:before {<br>
+  content: &quot;\f078&quot;;<br>
+}<br>
+<br>
+#sysmodules-content-area .arrow-up:before {<br>
+  content: &quot;\f077&quot;;<br>
+}<br>
+<br>
+#sysmodules-content-area .btn .fa-upload {<br>
+  margin-right: 10px;<br>
+  font-size: 20px;<br>
+}<br>
diff --git a/ui/css/src/ginger.scss b/ui/css/src/ginger.scss<br>
index 610ecea..862f298 100644<br>
--- a/ui/css/src/ginger.scss<br>
+++ b/ui/css/src/ginger.scss<br>
@@ -1,4 +1,4 @@<br>
-/*<br>
+    /*<br>
  * Copyright IBM Corp, 2015<br>
  *<br>
  * This library is free software; you can redistribute it and/or<br>
@@ -18,10 +18,8 @@<br>
<br>
 // Core variables<br>
 @import &quot;../../../../../../../ui/css/src/modules/wok-variables&quot;;<br>
-<br>
 // Compass Mixins<br>
 @import &quot;../../../../../../../ui/css/src/vendor/compass-mixins/lib/compass&quot;;<br>
-<br>
 .ui-tooltip {<br>
     width: &quot;&quot;;<br>
     display: inline-block;<br>
@@ -144,14 +142,68 @@<br>
 }<br>
<br>
 .ginger {<br>
-  div.modal-footer {<br>
-    background-color: #008abf;<br>
-  }<br>
-  .modal-body .nav-tabs &gt; li.active &gt; a, .modal-body .nav-tabs &gt; li.active &gt; a:hover, .modal-body .nav-tabs &gt; li.active &gt; a:focus{<br>
-    border-color:-moz-use-text-color -moz-use-text-color #008abf;<br>
-  }<br>
+    div.modal-footer {<br>
+        background-color: #008abf;<br>
+    }<br>
+    .modal-body .nav-tabs &gt; li.active &gt; a,<br>
+    .modal-body .nav-tabs &gt; li.active &gt; a:hover,<br>
+    .modal-body .nav-tabs &gt; li.active &gt; a:focus {<br>
+        border-color: -moz-use-text-color -moz-use-text-color #008abf;<br>
+    }<br>
+}<br>
+<br>
+@mixin ginger-accordion() {<br>
+    margin: 12px 20px 12px 60px;<br>
+    padding-bottom: 18px;<br>
+    border-bottom: 1px solid $table-border-color;<br>
+    overflow: visible;<br>
+    clear: both;<br>
+    &amp;:first-chld {<br>
+        margin-top: 24px;<br>
+    }<br>
+    &gt; h3 {<br>
+        margin: 0;<br>
+        padding: 0;<br>
+        font-size: 26px;<br>
+        font-weight: 300;<br>
+        height: 44px;<br>
+        display: block;<br>
+        a {<br>
+            color: $brand-primary;<br>
+            text-decoration: none;<br>
+            display: block;<br>
+            padding: 6px 30px;<br>
+            margin-left: -30px;<br>
+            margin-right: -30px;<br>
+            span.accordion-icon {<br>
+                margin-left: -52px;<br>
+                vertical-align: middle;<br>
+                display: inline-block;<br>
+                font: normal normal normal 32px/1 FontAwesome;<br>
+                text-rendering: auto;<br>
+                -webkit-font-smoothing: antialiased;<br>
+                color: $brand-primary;<br>
+            }<br>
+            &amp;[aria-expanded=&quot;false&quot;] {<br>
+                span.accordion-icon:before {<br>
+                    content: &quot;\f01a&quot;;<br>
+                }<br>
+            }<br>
+            &amp;[aria-expanded=&quot;true&quot;] {<br>
+                span.accordion-icon:before {<br>
+                    content: &quot;\f01b&quot;;<br>
+                }<br>
+            }<br>
+            span.accordion-text {<br>
+                margin-left: 23px;<br>
+                display: inline-block;<br>
+                vertical-align: middle;<br>
+            }<br>
+        }<br>
+    }<br>
 }<br>
<br>
 @import &quot;modules/administration&quot;;<br>
 @import &quot;modules/network&quot;;<br>
 @import &quot;modules/storage&quot;;<br>
+@import &quot;modules/sysmodules&quot;;<br>
\ No newline at end of file<br>
diff --git a/ui/css/src/modules/_sysmodules.scss b/ui/css/src/modules/_sysmodules.scss<br>
new file mode 100644<br>
index 0000000..5858dcc<br>
--- /dev/null<br>
+++ b/ui/css/src/modules/_sysmodules.scss<br>
@@ -0,0 +1,126 @@<br>
+//<br>
+// Project Ginger<br>
+//<br>
+// Copyright IBM, Corp. 2016<br>
+//<br>
+// Code derived from Project Kimchi<br>
+//<br>
+// Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);<br>
+// you may not use this file except in compliance with the License.<br>
+// You may obtain a copy of the License at<br>
+//<br>
+//     <a href="http://www.apache.org/licenses/LICENSE-2.0" rel="noreferrer" target="_blank">http://www.apache.org/licenses/LICENSE-2.0</a><br>
+//<br>
+// Unless required by applicable law or agreed to in writing, software<br>
+// distributed under the License is distributed on an &quot;AS IS&quot; BASIS,<br>
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br>
+// See the License for the specific language governing permissions and<br>
+// limitations under the License.<br>
+//<br>
+#host-sysmodules-root-container {<br>
+    .accordion {<br>
+        @include ginger-accordion();<br>
+    }<br>
+    .navbar-default.toolbar {<br>
+        background-color: $hosts-color !important;<br>
+    }<br>
+}<br>
+<br>
+#sysmodules-content-area {<br>
+    padding: 0;<br>
+    list-style-type: none;<br>
+    .li:nth-child(even) {<br>
+        background-color: #fcfcfc;<br>
+    }<br>
+    .li:nth-child(odd) {<br>
+        background-color: #fff;<br>
+    }<br>
+    .header,<br>
+    .body {<br>
+        &gt; span,<br>
+        &gt; div {<br>
+            padding: 6px 2px;<br>
+            display: inline-block;<br>
+            font-family: $font-family-sans-serif;<br>
+        }<br>
+    }<br>
+    .header {<br>
+        border-top: 0 none;<br>
+        &gt; span,<br>
+        &gt; div {<br>
+            vertical-align: bottom;<br>
+            height: 36px;<br>
+            font-weight: 300;<br>
+            font-size: 12.5pt;<br>
+            line-height: 1.42857;<br>
+            border-bottom: 0;<br>
+            border-top: 0;<br>
+        }<br>
+    }<br>
+    .body {<br>
+        border-top: 1px solid #eee;<br>
+        &gt; span,<br>
+        &gt; div {<br>
+            vertical-align: middle;<br>
+            font-size: 11pt;<br>
+            line-height: 2.42857;<br>
+            font-weight: 400;<br>
+        }<br>
+    }<br>
+    .btn-group {<br>
+        margin-bottom: 20px;<br>
+    }<br>
+    .actBtn {<br>
+        width: 115px;<br>
+    }<br>
+    .column-name {<br>
+        width: 30%;<br>
+    }<br>
+    .column-depends {<br>
+        width: 30%;<br>
+    }<br>
+    .column-details {<br>
+        width: 12%;<br>
+        vertical-align: middle;<br>
+        text-align: center;<br>
+    }<br>
+    .column-version {<br>
+        width: 14%;<br>
+    }<br>
+    .column-actions {<br>
+        width: 14%;<br>
+    }<br>
+    .sysmodules-details {<br>
+        width: 100%;<br>
+        padding: 22px;<br>
+        background: $table-bg-active;<br>
+    }<br>
+    .details-list {<br>
+        max-height: 285px;<br>
+        min-height: 140px;<br>
+        background: $table-bg;<br>
+        padding: 0;<br>
+        overflow-x: hidden;<br>
+        overflow-y: auto;<br>
+    }<br>
+    .arrow-down,<br>
+    .arrow-up {<br>
+        display: inline-block;<br>
+        font: normal normal normal 14px/1 FontAwesome;<br>
+        font-size: inherit;<br>
+        text-rendering: auto;<br>
+        -webkit-font-smoothing: antialiased;<br>
+        -moz-osx-font-smoothing: grayscale;<br>
+        cursor: pointer;<br>
+    }<br>
+    .arrow-down:before {<br>
+        content: &quot;\f078&quot;;<br>
+    }<br>
+    .arrow-up:before {<br>
+        content: &quot;\f077&quot;;<br>
+    }<br>
+    .btn .fa-upload {<br>
+        margin-right: 10px;<br>
+        font-size: 20px;<br>
+    }<br>
+}<br>
\ No newline at end of file<br>
diff --git a/ui/js/host-sysmodules.js b/ui/js/host-sysmodules.js<br>
new file mode 100644<br>
index 0000000..3644a02<br>
--- /dev/null<br>
+++ b/ui/js/host-sysmodules.js<br>
@@ -0,0 +1,76 @@<br>
+/*<br>
+ * Copyright IBM Corp, 2016<br>
+ *<br>
+ * This library is free software; you can redistribute it and/or<br>
+ * modify it under the terms of the GNU Lesser General Public<br>
+ * License as published by the Free Software Foundation; either<br>
+ * version 2.1 of the License, or (at your option) any later version.<br>
+ *<br>
+ * This library is distributed in the hope that it will be useful,<br>
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br>
+ * Lesser General Public License for more details.<br>
+ *<br>
+ * You should have received a copy of the GNU Lesser General Public<br>
+ * License along with this library; if not, write to the Free Software<br>
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA<br>
+ */<br>
+<br>
+ginger.initSysmodules = function() {<br>
+    $(&quot;.content-area&quot;, &quot;#gingerHostAdmin&quot;).css(&quot;height&quot;, &quot;100%&quot;);<br>
+    ginger.loadSysmodules();<br>
+};<br>
+<br>
+ginger.loadSysmodules = function() {<br>
+    ginger.getSysmodules(function(data) {<br>
+        $(&quot;#sysmodules-body&quot;).empty();<br>
+        for (var i = 0; i &lt; data.length; i++) {<br>
+            var tempNode = $.parseHTML(wok.substitute($(&quot;#sysmodulesItem&quot;).html(), data[i]));<br>
+            $(&quot;#sysmodules-body&quot;).append(tempNode);<br>
+<br>
+            $(&quot;.details-list&quot;, tempNode).append(&#39;Details&#39;);<br>
+<br>
+            $(&quot;.btn-unload&quot;).on(&quot;click&quot;, function(event) {<br>
+                event.preventDefault();<br>
+                event.stopImmediatePropagation();<br>
+                var sysmoduleItem = $(this).parent();<br>
+<br>
+                ginger.removeSysmodule(sysmoduleItem.prop(&quot;id&quot;), function() {<br>
+                    sysmoduleItem.remove();<br>
+                }, function(error) {<br>
+                    wok.message.error(&#39;Unable to unload the module.&#39;);<br>
+                });<br>
+            });<br>
+        }<br>
+<br>
+        $(&#39;.load-modules-btn&#39;).on(&#39;click&#39;, function(event) {<br>
+            // TODO: Implement load modules action<br>
+        });<br>
+<br>
+        $(&#39;.arrow&#39;).on(&#39;click&#39;, function(event) {<br>
+            var that = $(this).parent().parent();<br>
+            var slide = $(&#39;.sysmodules-details&#39;, $(this).parent().parent());<br>
+            if (that.hasClass(&#39;in&#39;)) {<br>
+                that.css(&#39;height&#39;, &#39;auto&#39;);<br>
+                that.removeClass(&#39;in&#39;);<br>
+                ginger.changeArrow($(&#39;.arrow-down&#39;, that));<br>
+                slide.slideDown(&#39;slow&#39;);<br>
+            } else {<br>
+                slide.slideUp(&#39;slow&#39;, function() {<br>
+                    that.css(&#39;height&#39;, &#39;&#39;);<br>
+                });<br>
+                that.addClass(&#39;in&#39;);<br>
+                ginger.changeArrow($(&#39;.arrow-up&#39;, that));<br>
+            }<br>
+        });<br>
+    });<br>
+<br>
+};<br>
+<br>
+ginger.changeArrow = function(obj) {<br>
+    if ($(obj).hasClass(&#39;arrow-down&#39;)) {<br>
+        $(obj).removeClass(&#39;arrow-down&#39;).addClass(&#39;arrow-up&#39;);<br>
+    } else {<br>
+        $(obj).removeClass(&#39;arrow-up&#39;).addClass(&#39;arrow-down&#39;);<br>
+    }<br>
+}<br>
\ No newline at end of file<br>
diff --git a/ui/js/util.js b/ui/js/util.js<br>
index ed12bd4..8e1cc17 100644<br>
--- a/ui/js/util.js<br>
+++ b/ui/js/util.js<br>
@@ -21,27 +21,27 @@ ginger.hostarch = null;<br>
 ginger.selectedInterface = null;<br>
<br>
 trackingTasks = [];<br>
-ginger.getFirmware = function(suc, err){<br>
+ginger.getFirmware = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/firmware&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/firmware&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.updateFirmware = function(content, suc, err){<br>
+ginger.updateFirmware = function(content, suc, err) {<br>
     $.ajax({<br>
-        url : &quot;plugins/ginger/firmware&quot;,<br>
-        type : &#39;PUT&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        data : JSON.stringify(content),<br>
+        url: &quot;plugins/ginger/firmware&quot;,<br>
+        type: &#39;PUT&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        data: JSON.stringify(content),<br>
         success: suc,<br>
         error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
@@ -50,82 +50,82 @@ ginger.updateFirmware = function(content, suc, err){<br>
 };<br>
<br>
 ginger.fwProgress = function(suc, err, progress) {<br>
-    var taskID = -1;<br>
-    var onResponse = function(data) {<br>
-        taskID = data[&#39;id&#39;];<br>
-        trackTask();<br>
-    };<br>
-<br>
-    var trackTask = function() {<br>
-        ginger.getTask(taskID, onTaskResponse, err);<br>
-    };<br>
-<br>
-    var onTaskResponse = function(result) {<br>
-        var taskStatus = result[&#39;status&#39;];<br>
-        switch(taskStatus) {<br>
-        case &#39;running&#39;:<br>
-            progress &amp;&amp; progress(result);<br>
-            setTimeout(function() {<br>
-                trackTask();<br>
-            }, 1000);<br>
-            break;<br>
-        case &#39;finished&#39;:<br>
-        case &#39;failed&#39;:<br>
-            suc(result);<br>
-            break;<br>
-        default:<br>
-            break;<br>
-        }<br>
+        var taskID = -1;<br>
+        var onResponse = function(data) {<br>
+            taskID = data[&#39;id&#39;];<br>
+            trackTask();<br>
+        };<br>
+<br>
+        var trackTask = function() {<br>
+            ginger.getTask(taskID, onTaskResponse, err);<br>
+        };<br>
+<br>
+        var onTaskResponse = function(result) {<br>
+            var taskStatus = result[&#39;status&#39;];<br>
+            switch (taskStatus) {<br>
+                case &#39;running&#39;:<br>
+                    progress &amp;&amp; progress(result);<br>
+                    setTimeout(function() {<br>
+                        trackTask();<br>
+                    }, 1000);<br>
+                    break;<br>
+                case &#39;finished&#39;:<br>
+                case &#39;failed&#39;:<br>
+                    suc(result);<br>
+                    break;<br>
+                default:<br>
+                    break;<br>
+            }<br>
+        };<br>
+<br>
+        wok.requestJSON({<br>
+            url: &#39;plugins/ginger/fwprogress&#39;,<br>
+            type: &quot;GET&quot;,<br>
+            contentType: &quot;application/json&quot;,<br>
+            dataType: &quot;json&quot;,<br>
+            success: onResponse,<br>
+            error: err<br>
+        });<br>
+    },<br>
+<br>
+<br>
+    ginger.listBackupArchives = function(suc, err) {<br>
+        wok.requestJSON({<br>
+            url: &#39;plugins/ginger/backup/archives&#39;,<br>
+            type: &#39;GET&#39;,<br>
+            contentType: &#39;application/json&#39;,<br>
+            dataType: &#39;json&#39;,<br>
+            resend: true,<br>
+            success: suc,<br>
+            error: err || function(data) {<br>
+                wok.message.error(data.responseJSON.reason);<br>
+            }<br>
+        });<br>
     };<br>
<br>
-    wok.requestJSON({<br>
-        url : &#39;plugins/ginger/fwprogress&#39;,<br>
-        type : &quot;GET&quot;,<br>
-        contentType : &quot;application/json&quot;,<br>
-        dataType : &quot;json&quot;,<br>
-        success : onResponse,<br>
-        error : err<br>
-    });<br>
-},<br>
-<br>
-<br>
-ginger.listBackupArchives = function(suc, err){<br>
-    wok.requestJSON({<br>
-        url : &#39;plugins/ginger/backup/archives&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
-            wok.message.error(data.responseJSON.reason);<br>
-        }<br>
-    });<br>
-};<br>
-<br>
 ginger.createBackupArchive = function(bak, suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/backup/archives&#39;,<br>
-        type : &#39;POST&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        data : JSON.stringify(bak),<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/backup/archives&#39;,<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        data: JSON.stringify(bak),<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.getBackupArchiveFile = function(id, suc, err){<br>
+ginger.getBackupArchiveFile = function(id, suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/backup/archives/&#39; + encodeURIComponent(id) + &#39;/file&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/backup/archives/&#39; + encodeURIComponent(id) + &#39;/file&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
@@ -133,12 +133,12 @@ ginger.getBackupArchiveFile = function(id, suc, err){<br>
<br>
 ginger.deleteBackupArchive = function(id, suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/backup/archives/&#39; + encodeURIComponent(id),<br>
-        type : &#39;DELETE&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/backup/archives/&#39; + encodeURIComponent(id),<br>
+        type: &#39;DELETE&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
@@ -146,13 +146,13 @@ ginger.deleteBackupArchive = function(id, suc, err) {<br>
<br>
 ginger.deleteBackupArchives = function(content, suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/backup/discard_archives&#39;,<br>
-        type : &#39;POST&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        data : JSON.stringify(content),<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/backup/discard_archives&#39;,<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        data: JSON.stringify(content),<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
@@ -160,25 +160,25 @@ ginger.deleteBackupArchives = function(content, suc, err) {<br>
<br>
 ginger.getInterfaces = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/network/interfaces&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/network/interfaces&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.updateInterface = function(name, content, suc, err){<br>
+ginger.updateInterface = function(name, content, suc, err) {<br>
     $.ajax({<br>
-        url : &#39;plugins/ginger/network/interfaces/&#39; + encodeURIComponent(name),<br>
-        type : &#39;PUT&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        data : JSON.stringify(content),<br>
+        url: &#39;plugins/ginger/network/interfaces/&#39; + encodeURIComponent(name),<br>
+        type: &#39;PUT&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        data: JSON.stringify(content),<br>
         success: suc,<br>
         error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
@@ -188,50 +188,50 @@ ginger.updateInterface = function(name, content, suc, err){<br>
<br>
 ginger.enableInterface = function(name, status, suc, err) {<br>
     wok.requestJSON({<br>
-        url : &quot;plugins/ginger/network/interfaces/&quot; + name +<br>
-              &#39;/&#39; + (status == &quot;down&quot; ? &#39;deactivate&#39; : &#39;activate&#39;),<br>
-        type : &#39;POST&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : err<br>
+        url: &quot;plugins/ginger/network/interfaces/&quot; + name +<br>
+            &#39;/&#39; + (status == &quot;down&quot; ? &#39;deactivate&#39; : &#39;activate&#39;),<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: err<br>
     });<br>
 };<br>
<br>
 ginger.deleteInterface = function(name, suc, err) {<br>
-  wok.requestJSON({<br>
-      url : &#39;plugins/ginger/network/cfginterfaces/&#39; + name,<br>
-      type : &#39;DELETE&#39;,<br>
-      contentType : &#39;application/json&#39;,<br>
-      dataType : &#39;json&#39;,<br>
-      success : suc,<br>
-      error : err || function(data) {<br>
-          wok.message.error(data.responseJSON.reason);<br>
-      }<br>
-  });<br>
+    wok.requestJSON({<br>
+        url: &#39;plugins/ginger/network/cfginterfaces/&#39; + name,<br>
+        type: &#39;DELETE&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
+            wok.message.error(data.responseJSON.reason);<br>
+        }<br>
+    });<br>
 };<br>
<br>
-ginger.getNetworkGlobals = function(suc, err){<br>
+ginger.getNetworkGlobals = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/network&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/network&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.updateNetworkGlobals = function(content, suc, err){<br>
+ginger.updateNetworkGlobals = function(content, suc, err) {<br>
     $.ajax({<br>
-        url : &#39;plugins/ginger/network&#39;,<br>
-        type : &#39;PUT&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        data : JSON.stringify(content),<br>
+        url: &#39;plugins/ginger/network&#39;,<br>
+        type: &#39;PUT&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        data: JSON.stringify(content),<br>
         success: suc,<br>
         error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
@@ -241,12 +241,12 @@ ginger.updateNetworkGlobals = function(content, suc, err){<br>
<br>
 ginger.confirmNetworkUpdate = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/network/confirm_change&#39;,<br>
-        type : &#39;POST&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/network/confirm_change&#39;,<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
@@ -254,55 +254,57 @@ ginger.confirmNetworkUpdate = function(suc, err) {<br>
<br>
 ginger.confirmInterfaceUpdate = function(name, suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/network/interfaces/&#39; + encodeURIComponent(name) + &#39;/confirm_change&#39;,<br>
-        type : &#39;POST&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/network/interfaces/&#39; + encodeURIComponent(name) + &#39;/confirm_change&#39;,<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.validateIp = function(ip){<br>
+ginger.validateIp = function(ip) {<br>
     var ipReg = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;<br>
     return ipReg.test(ip);<br>
 };<br>
<br>
-ginger.validateMask = function(mask){<br>
-    if(mask.indexOf(&#39;.&#39;)!=-1){<br>
+ginger.validateMask = function(mask) {<br>
+    if (mask.indexOf(&#39;.&#39;) != -1) {<br>
         var secs = mask.split(&#39;.&#39;);<br>
         var binMask = &quot;&quot;;<br>
-        for(var i=0; i&lt;secs.length; i++)<br>
+        for (var i = 0; i &lt; secs.length; i++)<br>
             binMask += parseInt(secs[i]).toString(2);<br>
         return /^1+0+$/.test(binMask);<br>
-    }else{<br>
+    } else {<br>
         return mask &gt; 0 &amp;&amp; mask &lt; 32;<br>
     }<br>
 };<br>
<br>
-ginger.getPowerProfiles = function(suc, err){<br>
+ginger.getPowerProfiles = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/powerprofiles&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/powerprofiles&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.activatePowerProfile = function(name, suc, err){<br>
+ginger.activatePowerProfile = function(name, suc, err) {<br>
     $.ajax({<br>
-        url : &quot;plugins/ginger/powerprofiles/&quot; + encodeURIComponent(name),<br>
-        type : &#39;PUT&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        data : JSON.stringify({ active: true }),<br>
+        url: &quot;plugins/ginger/powerprofiles/&quot; + encodeURIComponent(name),<br>
+        type: &#39;PUT&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        data: JSON.stringify({<br>
+            active: true<br>
+        }),<br>
         success: suc,<br>
         error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
@@ -310,113 +312,113 @@ ginger.activatePowerProfile = function(name, suc, err){<br>
     });<br>
 };<br>
<br>
-ginger.getSANAdapters = function(suc, err){<br>
+ginger.getSANAdapters = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/san_adapters&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/san_adapters&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.getSensors = function(suc, err){<br>
+ginger.getSensors = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/sensors&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/sensors&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.getSEPSubscriptions = function(suc, err){<br>
+ginger.getSEPSubscriptions = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/ibm_sep&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/ibm_sep&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.deleteSubscription = function (hostname, suc, err) {<br>
+ginger.deleteSubscription = function(hostname, suc, err) {<br>
     wok.requestJSON({<br>
-        url : wok.url + &#39;plugins/ginger/ibm_sep/subscribers/&#39; + hostname,<br>
-        type : &#39;DELETE&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: wok.url + &#39;plugins/ginger/ibm_sep/subscribers/&#39; + hostname,<br>
+        type: &#39;DELETE&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 }<br>
<br>
-ginger.addSEPSubscription = function(subscription, suc, err){<br>
+ginger.addSEPSubscription = function(subscription, suc, err) {<br>
     wok.requestJSON({<br>
-        url : wok.url + &#39;plugins/ginger/ibm_sep/subscribers&#39;,<br>
-        type : &#39;POST&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        data : JSON.stringify(subscription),<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: wok.url + &#39;plugins/ginger/ibm_sep/subscribers&#39;,<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        data: JSON.stringify(subscription),<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.getSEPStatus = function(suc, err){<br>
+ginger.getSEPStatus = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/ibm_sep&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/ibm_sep&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.startSEP = function(suc, err){<br>
+ginger.startSEP = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/ibm_sep/start&#39;,<br>
-        type : &#39;POST&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/ibm_sep/start&#39;,<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 };<br>
<br>
-ginger.stopSEP = function(suc, err){<br>
+ginger.stopSEP = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/ibm_sep/stop&#39;,<br>
-        type : &#39;POST&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : err || function(data) {<br>
+        url: &#39;plugins/ginger/ibm_sep/stop&#39;,<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
@@ -424,13 +426,13 @@ ginger.stopSEP = function(suc, err){<br>
<br>
 ginger.getUsers = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/users&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error : function(data) {<br>
+        url: &#39;plugins/ginger/users&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
@@ -438,27 +440,27 @@ ginger.getUsers = function(suc, err) {<br>
<br>
 ginger.addUser = function(username, suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/users&#39;,<br>
-        type : &#39;POST&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        data : JSON.stringify(username),<br>
-        dataType : &#39;json&#39;,<br>
-        resend : true,<br>
-        success : suc,<br>
-        error :  err || function(data) {<br>
-             wok.message.error(data.responseJSON.reason);<br>
+        url: &#39;plugins/ginger/users&#39;,<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        data: JSON.stringify(username),<br>
+        dataType: &#39;json&#39;,<br>
+        resend: true,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
+            wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 }<br>
<br>
-ginger.deleteUser = function (username, suc, err) {<br>
+ginger.deleteUser = function(username, suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/users/&#39; + username,<br>
-        type : &#39;DELETE&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : function(data) {<br>
+        url: &#39;plugins/ginger/users/&#39; + username,<br>
+        type: &#39;DELETE&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
@@ -466,12 +468,12 @@ ginger.deleteUser = function (username, suc, err) {<br>
<br>
 ginger.getCapabilities = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/capabilities&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : function(data) {<br>
+        url: &#39;plugins/ginger/capabilities&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
@@ -480,16 +482,16 @@ ginger.getCapabilities = function(suc, err) {<br>
 /**<br>
  * Get the host information.<br>
  */<br>
-ginger.getHostDetails = function (suc,err) {<br>
-  wok.requestJSON({<br>
-      url : &#39;plugins/gingerbase/host&#39;,<br>
-      type : &#39;GET&#39;,<br>
-      resend: true,<br>
-      contentType : &#39;application/json&#39;,<br>
-      dataType : &#39;json&#39;,<br>
-      success : suc,<br>
-      error: err<br>
-  });<br>
+ginger.getHostDetails = function(suc, err) {<br>
+    wok.requestJSON({<br>
+        url: &#39;plugins/gingerbase/host&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        resend: true,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: err<br>
+    });<br>
 }<br>
<br>
 /**<br>
@@ -497,89 +499,103 @@ ginger.getHostDetails = function (suc,err) {<br>
  */<br>
 ginger.getPlugins = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins&#39;,<br>
-        type : &#39;GET&#39;,<br>
+        url: &#39;plugins&#39;,<br>
+        type: &#39;GET&#39;,<br>
         resend: true,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
         error: err<br>
     });<br>
 };<br>
-ginger.getFilesystems =  function(suc , err){<br>
-       wok.requestJSON({<br>
-        url : &#39;plugins/ginger/filesystems&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : function(data) {<br>
+ginger.getFilesystems = function(suc, err) {<br>
+    wok.requestJSON({<br>
+        url: &#39;plugins/ginger/filesystems&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 }<br>
-ginger.getSwapdevices =  function(suc , err){<br>
-       wok.requestJSON({<br>
-        url : &#39;plugins/ginger/swaps&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : function(data) {<br>
+ginger.getSwapdevices = function(suc, err) {<br>
+    wok.requestJSON({<br>
+        url: &#39;plugins/ginger/swaps&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 }<br>
<br>
-ginger.getVolumegroups =  function(suc , err){<br>
-       wok.requestJSON({<br>
-        url : &#39;plugins/ginger/vgs&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : function(data) {<br>
+ginger.getVolumegroups = function(suc, err) {<br>
+    wok.requestJSON({<br>
+        url: &#39;plugins/ginger/vgs&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: function(data) {<br>
+            wok.message.error(data.responseJSON.reason);<br>
+        }<br>
+    });<br>
+}<br>
+ginger.getStgdevs = function(suc, err) {<br>
+    wok.requestJSON({<br>
+        url: &#39;plugins/ginger/stgdevs&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 }<br>
-ginger.getStgdevs =  function(suc , err){<br>
+<br>
+ginger.getFcpTapeDevices = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/stgdevs&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : function(data) {<br>
+        url: &#39;plugins/gingers390x/lstapes&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 }<br>
<br>
-ginger.getFcpTapeDevices =  function(suc , err){<br>
+ginger.getSysmodules = function(suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/gingers390x/lstapes&#39;,<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : function(data) {<br>
+        url: &#39;plugins/ginger/sysmodules&#39;,<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: function(data) {<br>
             wok.message.error(data.responseJSON.reason);<br>
         }<br>
     });<br>
 }<br>
+<br>
 ginger.formatDASDDevice = function(busId, settings, suc, err, progress) {<br>
     var onResponse = function(data) {<br>
-       taskID = data[&#39;id&#39;];<br>
-       ginger.trackTask(taskID, suc, err, progress);<br>
+        taskID = data[&#39;id&#39;];<br>
+        ginger.trackTask(taskID, suc, err, progress);<br>
     };<br>
<br>
     wok.requestJSON({<br>
-        url : &#39;/plugins/ginger/dasddevs/&#39;+busId+&#39;/format&#39;,<br>
-        type : &#39;POST&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        data : JSON.stringify(settings),<br>
-        dataType : &#39;json&#39;,<br>
+        url: &#39;/plugins/ginger/dasddevs/&#39; + busId + &#39;/format&#39;,<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        data: JSON.stringify(settings),<br>
+        dataType: &#39;json&#39;,<br>
         success: onResponse,<br>
         error: err<br>
     });<br>
@@ -587,11 +603,11 @@ ginger.formatDASDDevice = function(busId, settings, suc, err, progress) {<br>
<br>
 ginger.removeDASDDevice = function(busId, settings, suc, err, progress) {<br>
     wok.requestJSON({<br>
-        url : &quot;/plugins/gingers390x/storagedevices/&quot;+ busId +&quot;/offline&quot;,<br>
-        type : &#39;POST&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        data : JSON.stringify(settings),<br>
-        dataType : &#39;json&#39;,<br>
+        url: &quot;/plugins/gingers390x/storagedevices/&quot; + busId + &quot;/offline&quot;,<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        data: JSON.stringify(settings),<br>
+        dataType: &#39;json&#39;,<br>
         success: suc,<br>
         error: err<br>
     });<br>
@@ -599,11 +615,22 @@ ginger.removeDASDDevice = function(busId, settings, suc, err, progress) {<br>
<br>
 ginger.removeFCDevice = function(lunPath, settings, suc, err, progress) {<br>
     wok.requestJSON({<br>
-        url : &quot;/plugins/gingers390x/fcluns/&quot;+ lunPath,<br>
-        type : &#39;DELETE&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        data : JSON.stringify(settings),<br>
-        dataType : &#39;json&#39;,<br>
+        url: &quot;/plugins/gingers390x/fcluns/&quot; + lunPath,<br>
+        type: &#39;DELETE&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        data: JSON.stringify(settings),<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: err<br>
+    });<br>
+}<br>
+<br>
+ginger.removeSysmodule = function(moduleId, suc, err) {<br>
+    wok.requestJSON({<br>
+        url: &#39;plugins/ginger/sysmodules/&#39; + moduleId,<br>
+        type: &#39;DELETE&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
         success: suc,<br>
         error: err<br>
     });<br>
@@ -611,45 +638,45 @@ ginger.removeFCDevice = function(lunPath, settings, suc, err, progress) {<br>
<br>
 ginger.getTask = function(taskId, suc, err) {<br>
     wok.requestJSON({<br>
-        url : &#39;plugins/ginger/tasks/&#39; + encodeURIComponent(taskId),<br>
-        type : &#39;GET&#39;,<br>
-        contentType : &#39;application/json&#39;,<br>
-        dataType : &#39;json&#39;,<br>
-        success : suc,<br>
-        error : err<br>
+        url: &#39;plugins/ginger/tasks/&#39; + encodeURIComponent(taskId),<br>
+        type: &#39;GET&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: err<br>
     });<br>
 }<br>
 ginger.trackTask = function(taskID, suc, err, progress) {<br>
     var onTaskResponse = function(result) {<br>
         var taskStatus = result[&#39;status&#39;];<br>
-        switch(taskStatus) {<br>
-        case &#39;running&#39;:<br>
-            progress &amp;&amp; progress(result);<br>
-            setTimeout(function() {<br>
-                ginger.trackTask(taskID, suc, err, progress);<br>
-            }, 2000);<br>
-            break;<br>
-        case &#39;finished&#39;:<br>
-            suc &amp;&amp; suc(result);<br>
-            break;<br>
-        case &#39;failed&#39;:<br>
-            err &amp;&amp; err(result);<br>
-            break;<br>
-        default:<br>
-            break;<br>
+        switch (taskStatus) {<br>
+            case &#39;running&#39;:<br>
+                progress &amp;&amp; progress(result);<br>
+                setTimeout(function() {<br>
+                    ginger.trackTask(taskID, suc, err, progress);<br>
+                }, 2000);<br>
+                break;<br>
+            case &#39;finished&#39;:<br>
+                suc &amp;&amp; suc(result);<br>
+                break;<br>
+            case &#39;failed&#39;:<br>
+                err &amp;&amp; err(result);<br>
+                break;<br>
+            default:<br>
+                break;<br>
         }<br>
     };<br>
<br>
     ginger.getTask(taskID, onTaskResponse, err);<br>
-    if(trackingTasks.indexOf(taskID) &lt; 0)<br>
+    if (trackingTasks.indexOf(taskID) &lt; 0)<br>
         trackingTasks.push(taskID);<br>
 }<br>
<br>
-ginger.trackdevices = function(trackDevicelist,removeItem) {<br>
+ginger.trackdevices = function(trackDevicelist, removeItem) {<br>
     &quot;use strict&quot;;<br>
     trackDevicelist = jQuery.grep(trackDevicelist, function(value) {<br>
-          return value != removeItem;<br>
-        });<br>
+        return value != removeItem;<br>
+    });<br>
     return trackDevicelist;<br>
 };<br>
<br>
@@ -657,17 +684,17 @@ ginger.trackdevices = function(trackDevicelist,removeItem) {<br>
  * Create a network interface with new information.<br>
  */<br>
 ginger.createCfgInterface = function(settings, suc, err) {<br>
-  wok.requestJSON({<br>
-    url: &#39;plugins/ginger/network/cfginterfaces/&#39;,<br>
-    type: &#39;POST&#39;,<br>
-    contentType: &#39;application/json&#39;,<br>
-    data: JSON.stringify(settings),<br>
-    dataType: &#39;json&#39;,<br>
-    success: suc,<br>
-    error: err || function(data) {<br>
-      wok.message.error(data.responseJSON.reason);<br>
-    }<br>
-  });<br>
+    wok.requestJSON({<br>
+        url: &#39;plugins/ginger/network/cfginterfaces/&#39;,<br>
+        type: &#39;POST&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        data: JSON.stringify(settings),<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: err || function(data) {<br>
+            wok.message.error(data.responseJSON.reason);<br>
+        }<br>
+    });<br>
 }<br>
<br>
 /**<br>
@@ -678,74 +705,74 @@ ginger.createCfgInterface = function(settings, suc, err) {<br>
  * @param err callback for error<br>
  */<br>
 ginger.listCfgInterface = function(suc, err) {<br>
-    wok.requestJSON({<br>
-      url: &#39;plugins/ginger/network/cfginterfaces/&#39;,<br>
-      type: &#39;GET&#39;,<br>
-      contentType: &#39;application/json&#39;,<br>
-      dataType: &#39;json&#39;,<br>
-      success: suc,<br>
-      error: err<br>
-    });<br>
-}<br>
-/**<br>
- * Retrieve the information of a given network interface by its name from it&#39;s cfg file.<br>
- *<br>
- * @param interface name<br>
- * @param suc callback for success<br>
- * @param err callback for error<br>
- */<br>
+        wok.requestJSON({<br>
+            url: &#39;plugins/ginger/network/cfginterfaces/&#39;,<br>
+            type: &#39;GET&#39;,<br>
+            contentType: &#39;application/json&#39;,<br>
+            dataType: &#39;json&#39;,<br>
+            success: suc,<br>
+            error: err<br>
+        });<br>
+    }<br>
+    /**<br>
+     * Retrieve the information of a given network interface by its name from it&#39;s cfg file.<br>
+     *<br>
+     * @param interface name<br>
+     * @param suc callback for success<br>
+     * @param err callback for error<br>
+     */<br>
 ginger.retrieveCfgInterface = function(interface, suc, err) {<br>
+        wok.requestJSON({<br>
+            url: &#39;plugins/ginger/network/cfginterfaces/&#39; + interface,<br>
+            type: &#39;GET&#39;,<br>
+            contentType: &#39;application/json&#39;,<br>
+            dataType: &#39;json&#39;,<br>
+            success: suc,<br>
+            error: err<br>
+        });<br>
+    }<br>
+    /**<br>
+     * Update a network interface with new information.<br>
+     */<br>
+ginger.updateCfgInterface = function(interface, settings, suc, err) {<br>
     wok.requestJSON({<br>
-      url: &#39;plugins/ginger/network/cfginterfaces/&#39;+interface,<br>
-      type: &#39;GET&#39;,<br>
-      contentType: &#39;application/json&#39;,<br>
-      dataType: &#39;json&#39;,<br>
-      success: suc,<br>
-      error: err<br>
+        url: &#39;plugins/ginger/network/cfginterfaces/&#39; + encodeURIComponent(interface),<br>
+        type: &#39;PUT&#39;,<br>
+        contentType: &#39;application/json&#39;,<br>
+        data: JSON.stringify(settings),<br>
+        dataType: &#39;json&#39;,<br>
+        success: suc,<br>
+        error: err<br>
     });<br>
 }<br>
-  /**<br>
-   * Update a network interface with new information.<br>
-   */<br>
-ginger.updateCfgInterface = function(interface, settings, suc, err) {<br>
-  wok.requestJSON({<br>
-    url: &#39;plugins/ginger/network/cfginterfaces/&#39; + encodeURIComponent(interface),<br>
-    type: &#39;PUT&#39;,<br>
-    contentType: &#39;application/json&#39;,<br>
-    data: JSON.stringify(settings),<br>
-    dataType: &#39;json&#39;,<br>
-    success: suc,<br>
-    error: err<br>
-  });<br>
-}<br>
<br>
-ginger.disableclass =  function(clas){<br>
-  jQuery(&quot;.&quot;+clas).css(&#39;pointer-events&#39;, &#39;none&#39;)<br>
-  jQuery(&quot;.&quot;+clas).find(&quot;input, select, button, textarea, div&quot;).attr(&quot;disabled&quot;,true);<br>
-  jQuery(&quot;.&quot;+clas).css(&#39;opacity&#39;, &#39;0.5&#39;)<br>
+ginger.disableclass = function(clas) {<br>
+    jQuery(&quot;.&quot; + clas).css(&#39;pointer-events&#39;, &#39;none&#39;)<br>
+    jQuery(&quot;.&quot; + clas).find(&quot;input, select, button, textarea, div&quot;).attr(&quot;disabled&quot;, true);<br>
+    jQuery(&quot;.&quot; + clas).css(&#39;opacity&#39;, &#39;0.5&#39;)<br>
 }<br>
<br>
-ginger.enableclass =  function(clas){<br>
-  jQuery(&quot;.&quot;+clas).css(&#39;pointer-events&#39;, &#39;auto&#39;)<br>
-  jQuery(&quot;.&quot;+clas).find(&quot;input, select, button, textarea, div&quot;).attr(&quot;disabled&quot;,false);<br>
-  jQuery(&quot;.&quot;+clas).css(&#39;opacity&#39;, &#39;initial&#39;)<br>
+ginger.enableclass = function(clas) {<br>
+    jQuery(&quot;.&quot; + clas).css(&#39;pointer-events&#39;, &#39;auto&#39;)<br>
+    jQuery(&quot;.&quot; + clas).find(&quot;input, select, button, textarea, div&quot;).attr(&quot;disabled&quot;, false);<br>
+    jQuery(&quot;.&quot; + clas).css(&#39;opacity&#39;, &#39;initial&#39;)<br>
 }<br>
<br>
 ginger.isInteger = function(value) {<br>
-return !isNaN(value) &amp;&amp;<br>
-       parseInt(Number(value)) == value &amp;&amp;<br>
-       !isNaN(parseInt(value, 10));<br>
+    return !isNaN(value) &amp;&amp;<br>
+        parseInt(Number(value)) == value &amp;&amp;<br>
+        !isNaN(parseInt(value, 10));<br>
 }<br>
<br>
 ginger.isValidIPv6 = function(ipv6addr) {<br>
-  if (/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(ipv6addr)) {<br>
-      return true;<br>
-  } else {<br>
-      return false;<br>
-  }<br>
-  return false;<br>
+    if (/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$|^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])$|^\s*((([0-9A-Fa-f]{1,4}:){7}([0-9A-Fa-f]{1,4}|:))|(([0-9A-Fa-f]{1,4}:){6}(:[0-9A-Fa-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){5}(((:[0-9A-Fa-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9A-Fa-f]{1,4}:){4}(((:[0-9A-Fa-f]{1,4}){1,3})|((:[0-9A-Fa-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){3}(((:[0-9A-Fa-f]{1,4}){1,4})|((:[0-9A-Fa-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){2}(((:[0-9A-Fa-f]{1,4}){1,5})|((:[0-9A-Fa-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9A-Fa-f]{1,4}:){1}(((:[0-9A-Fa-f]{1,4}){1,6})|((:[0-9A-Fa-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9A-Fa-f]{1,4}){1,7})|((:[0-9A-Fa-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$/.test(ipv6addr)) {<br>
+        return true;<br>
+    } else {<br>
+        return false;<br>
+    }<br>
+    return false;<br>
 }<br>
<br>
 ginger.isValidIPv6Prefix = function(prefix) {<br>
-  return prefix &gt; 0 &amp;&amp; prefix &lt; 127;<br>
-}<br>
+    return prefix &gt; 0 &amp;&amp; prefix &lt; 127;<br>
+}<br>
\ No newline at end of file<br>
diff --git a/ui/pages/tabs/host-sysmodules.html.tmpl b/ui/pages/tabs/host-sysmodules.html.tmpl<br>
new file mode 100644<br>
index 0000000..d7225de<br>
--- /dev/null<br>
+++ b/ui/pages/tabs/host-sysmodules.html.tmpl<br>
@@ -0,0 +1,88 @@<br>
+&lt;!DOCTYPE html&gt;<br>
+&lt;!--<br>
+Copyright IBM Corp, 2016<br>
+<br>
+This library is free software; you can redistribute it and/or<br>
+modify it under the terms of the GNU Lesser General Public<br>
+License as published by the Free Software Foundation; either<br>
+version 2.1 of the License, or (at your option) any later version.<br>
+<br>
+This library is distributed in the hope that it will be useful,<br>
+but WITHOUT ANY WARRANTY; without even the implied warranty of<br>
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU<br>
+Lesser General Public License for more details.<br>
+<br>
+You should have received a copy of the GNU Lesser General Public<br>
+License along with this library; if not, write to the Free Software<br>
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA<br>
+--&gt;<br>
+#unicode UTF-8<br>
+#import gettext<br>
+#silent t = gettext.translation($lang.domain, $lang.localedir, languages=$lang.lang)<br>
+#silent _ = t.gettext<br>
+#silent _t = t.gettext<br>
+&lt;html&gt;<br>
+&lt;head&gt;<br>
+&lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;plugins/ginger/css/ginger.css&quot;&gt;<br>
+&lt;script type=&quot;text/javascript&quot; src=&quot;plugins/ginger/js/util.js&quot;&gt;&lt;/script&gt;<br>
+&lt;script type=&quot;text/javascript&quot; src=&quot;plugins/ginger/js/host-sysmodules.js&quot;&gt;&lt;/script&gt;<br>
+&lt;script type=&quot;text/javascript&quot; src=&quot;plugins/ginger/js/ginger-bootgrid.js&quot;&gt;&lt;/script&gt;<br>
+&lt;/head&gt;<br>
+&lt;body&gt;<br>
+    &lt;div id=&quot;host-sysmodules-root-container&quot; class=&quot;ginger&quot;&gt;<br>
+        &lt;nav class=&quot;navbar navbar-default toolbar&quot;&gt;<br>
+            &lt;div class=&quot;container&quot;&gt;<br>
+                &lt;div id=&quot;toolbar&quot;&gt;&lt;/div&gt;<br>
+            &lt;/div&gt;<br>
+        &lt;/nav&gt;<br>
+        &lt;div class=&quot;container&quot;&gt;<br>
+            &lt;div id=&quot;alert-container&quot;&gt;&lt;/div&gt;<br>
+            &lt;div id=&quot;gingerHostAdmin&quot; class=&quot;host-admin&quot;&gt;<br>
+                &lt;div class=&quot;panel-group accordion&quot; id=&quot;sysmodules-accordion&quot; role=&quot;tablist&quot; aria-multiselectable=&quot;true&quot;&gt;<br>
+                     &lt;h3&gt;<br>
+                        &lt;a role=&quot;button&quot; data-toggle=&quot;collapse&quot; data-parent=&quot;#sysmodules-accordion&quot; href=&quot;#sysmodules-content-area&quot; aria-expanded=&quot;false&quot; aria-controls=&quot;sysmodules-content-area&quot; class=&quot;&quot;&gt;<br>
+                            &lt;span class=&quot;accordion-icon&quot;&gt;&lt;/span&gt;&lt;span class=&quot;accordion-text&quot;&gt;$_(&quot;System Modules Management&quot;)&lt;/span&gt;<br>
+                        &lt;/a&gt;<br>
+                    &lt;/h3&gt;<br>
+                    &lt;div id=&quot;sysmodules-content-area&quot; class=&quot;panel-collapse collapse in&quot; role=&quot;tabpanel&quot; aria-labelledby=&quot;headingOne&quot;&gt;<br>
+                         &lt;div class=&quot;sysmodules-actions btn-group&quot; id=&quot;sysmodules-actions-<br>
+                         area&quot;&gt;<br>
+                            &lt;button class=&quot;btn btn-primary actBtn load-modules-btn&quot; type=&quot;submit&quot; data-toggle=&quot;modal&quot; data-target=&quot;#loadModule&quot;&gt;&lt;i class=&quot;fa fa-download&quot;&gt;&lt;/i&gt; $_(&quot;Load Modules&quot;)&lt;/button&gt;<br>
+                         &lt;/div&gt;<br>
+                         &lt;div class=&quot;wok-datagrid&quot; id=&quot;sysmodules-datagrid&quot;&gt;<br>
+                            &lt;div class=&quot;wok-datagrid-header&quot;&gt;<br>
+                                &lt;span class=&quot;column-name&quot;&gt;$_(&quot;Name&quot;)&lt;/span&gt;&lt;!--<br>
+                                --&gt;&lt;span class=&quot;column-depends&quot;&gt;$_(&quot;Depends On&quot;)&lt;/span&gt;&lt;!--<br>
+                                --&gt;&lt;span class=&quot;column-version&quot;&gt;$_(&quot;Version&quot;)&lt;/span&gt;&lt;!--<br>
+                                --&gt;&lt;span class=&quot;column-details&quot;&gt;$_(&quot;Details&quot;)&lt;/span&gt;&lt;!--<br>
+                                --&gt;&lt;span class=&quot;column-actions&quot; style=&quot;display:none&quot;&gt;<br>
+                                    &lt;span class=&quot;sr-only&quot;&gt;Actions&lt;/span&gt;&lt;!--<br>
+                                --&gt;&lt;/span&gt;<br>
+                            &lt;/div&gt;<br>
+                            &lt;ul class=&quot;wok-datagrid-body&quot; id=&quot;sysmodules-body&quot;&gt;&lt;/ul&gt;<br>
+                         &lt;/div&gt;<br>
+                    &lt;/div&gt;<br>
+                &lt;/div&gt;<br>
+            &lt;/div&gt;<br>
+        &lt;/div&gt;<br>
+    &lt;/div&gt;<br>
+&lt;script id=&quot;sysmodulesItem&quot; type=&quot;html/text&quot;&gt;<br>
+    &lt;li class=&quot;wok-datagrid-row in&quot; name=&quot;sysmodulesBodyItem&quot; id=&quot;{name}&quot;&gt;<br>
+        &lt;span class=&quot;column-name&quot; title=&quot;{name}&quot;&gt;{name}&lt;/span&gt;&lt;!--<br>
+        --&gt;&lt;span class=&quot;column-depends&quot;&gt;{depends}&lt;/span&gt;&lt;!--<br>
+        --&gt;&lt;span class=&quot;column-version&quot;&gt;{version}&lt;/span&gt;&lt;!--<br>
+        --&gt;&lt;span class=&quot;column-details&quot;&gt;<br>
+            &lt;div class=&quot;arrow arrow-down&quot;&gt;&lt;/div&gt;<br>
+        &lt;/span&gt;&lt;!--<br>
+        --&gt;&lt;span class=&quot;column-actions btn btn-link btn-unload&quot;&gt;&lt;i class=&quot;fa fa-upload&quot;&gt;&lt;/i&gt; $_(&quot;Unload&quot;)&lt;/span&gt;<br>
+        &lt;div class=&quot;sysmodules-details&quot; style=&quot;display: none;&quot;&gt;<br>
+            &lt;div class=&quot;details-list&quot; &gt;&lt;/div&gt;<br>
+        &lt;/div&gt;<br>
+        &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;<br>
+    &lt;/li&gt;<br>
+&lt;/script&gt;<br>
+&lt;script&gt;<br>
+    ginger.initSysmodules();<br>
+&lt;/script&gt;<br>
+&lt;/body&gt;<br>
+&lt;/html&gt;<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.8.3.1<br>
<br>
</font></span></blockquote></div><br><br clear="all"><br>-- <br><div class="gmail_signature"><div dir="ltr"><br>André Teodoro<br></div></div>
</div></div></div>