diff --git a/Targets/Example1/AdminLTE/_ex1_PARAMS.html.ep b/Targets/Example1/AdminLTE/_ex1_PARAMS.html.ep
new file mode 100644
index 0000000..330bca6
--- /dev/null
+++ b/Targets/Example1/AdminLTE/_ex1_PARAMS.html.ep
@@ -0,0 +1,53 @@
+%#
+%# Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-09-06 06:03:54
+%#
+%# Specific for AdminLTE theme
+%#
+
+%#
+ % if (config->{debug} == 1) {
+
+ %= dumper $ex1_data
+
+ % }
+ % my $btn = l('ex1_SAVE');
+ % $c->param(Selected => undef); #This may need deleting for a params panel - only needed for a table
+
+ %= form_for "example1u" => (method => 'POST') => begin
+ % param 'trt' => $ex1_data->{trt} unless param 'trt';
+ %= hidden_field 'trt' => $ex1_data->{trt}
+ %# Inputs etc in here.
+
+
<%=l('ex1_Example_Contrib')%>
+
+
<%=l('ex1_Manage_Ibay_settings:')%>
+
+
+ %=l('ex1_These_parameters_will_be_effective')
+
+
+
+ %=l('ex1_Information_Bay_name')
+
+ % param 'IbayName' => $ex1_data->{IbayName} unless param 'IbayName';
+ %= text_field 'IbayName', size => '50', class => 'textinput IbayName' , pattern=>'.*' , placeholder=>'IbayName', title =>'Pattern regex mismatch', id => 'IbayName_text'
+
+
+
+ %=l('ex1_Share_owner_Group')
+
+ % my @ShareOwnerGrp_options = [['Write = admin, Read = group' => 'All'], ['Write = group, Read = everyone' => 'Read:All-Write:Grp']];
+ % param 'ShareOwnerGrp' => $ex1_data->{ShareOwnerGrp} unless param 'ShareOwnerGrp';
+ %= select_field 'ShareOwnerGrp' => @ShareOwnerGrp_options, class => 'input', id => 'ShareOwnerGrp_select'
+
+
+ %# ....
+ %# Probably finally by a submit.
+ %= submit_button $btn, class => 'action'
+ %end
+
+
\ No newline at end of file
diff --git a/Targets/Example1/AdminLTE/_ex1_TABLE.html.ep b/Targets/Example1/AdminLTE/_ex1_TABLE.html.ep
new file mode 100644
index 0000000..d5d4b58
--- /dev/null
+++ b/Targets/Example1/AdminLTE/_ex1_TABLE.html.ep
@@ -0,0 +1,57 @@
+%#
+%# Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-09-06 06:03:54
+%#
+%# Specific for AdminLTE theme
+%#
+
+%#
+ % if (config->{debug} == 1) {
+
+ %= dumper $ex1_data
+
+ % }
+ % my $btn = l('ex1_SAVE');
+ % $c->param(Selected => undef); #This may need deleting for a params panel - only needed for a table
+
+ %= form_for "example1u" => (method => 'POST') => begin
+ % param 'trt' => $ex1_data->{trt} unless param 'trt';
+ %= hidden_field 'trt' => $ex1_data->{trt}
+ %# Inputs etc in here.
+
+
<%=l('ex1_NFS_Share_Contrib')%>
+
+
<%=l('ex1_Manage_NFS_Ibay_settings:')%>
+
+
+
+
+ <%=l('ex1_Name')%> |
+ <%=l('ex1_Description')%> |
+ <%=l('ex1_Status')%> |
+ <%=l('ex1_Action')%> |
+
+
+
+ % my $control_data = $c->stash('ibays');
+ % foreach my $row (@$control_data) {
+
+ <%=$c->render_to_string(inline=>$row->{'Name'})%> |
+ <%=$c->render_to_string(inline=>$row->{'Description'})%> |
+ <%=$c->render_to_string(inline=>$row->{'flag'})%> |
+ <%=$c->render_to_string(inline=>$row->{'Modify'})%> |
+
+ %}
+
+
+
+
+ %# ....
+ %# Probably finally by a submit.
+ %= submit_button $btn, class => 'action'
+ %end
+
+
\ No newline at end of file
diff --git a/Targets/Example1/AdminLTE/example1.css b/Targets/Example1/AdminLTE/example1.css
new file mode 100644
index 0000000..b16f6dd
--- /dev/null
+++ b/Targets/Example1/AdminLTE/example1.css
@@ -0,0 +1,20 @@
+/*
+Generated by: SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-09-06 06:03:54
+*/
+.Example1-panel {}
+.name {}
+.rout {}
+.head {}
+.subh {}
+.para1 {}
+.text1 {}
+.sele2 {}
+.name {}
+.rout {}
+.head {}
+.subh {}
+.next {}
+.tabl1 {}
+thead .tabl1 {}
+tbody .tabl1 {}
+.next {}
diff --git a/Targets/Example1/AdminLTE/example1.html.ep b/Targets/Example1/AdminLTE/example1.html.ep
new file mode 100644
index 0000000..382b271
--- /dev/null
+++ b/Targets/Example1/AdminLTE/example1.html.ep
@@ -0,0 +1,58 @@
+%#
+%# Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-09-06 06:03:54
+%#
+%# AdminLTE specific layout
+%#
+% layout 'default', title => "Sme server 2 - Example 1", share_dir => './';
+%# css specific to this panel:
+% content_for 'module' => begin
+%= stylesheet '/css/example1.css'
+%= javascript '/js/example1.js'
+
+
+ % if (config->{debug} == 1) {
+
+ %= dumper $c->current_route
+ %= dumper $ex1_data->{trt}
+
+ % }
+
+
<%=$title%>
+
+ % if ( stash('modul')) {
+ %= $c->render_to_string(inline => stash('modul') );
+ % }
+
+ %if ($c->stash('first')) {
+
+ %=$c->render_to_string(inline =>$c->l($c->stash('first')))
+
+
+ %} elsif ($c->stash('success')) {
+
+ %= $c->l($c->stash('success'));
+
+
+ %} elsif ($c->stash('error')) {
+
+ %= $c->l($c->stash('error'));
+
+ %}
+
+ %#Routing to partials according to trt parameter.
+ %#This ought to be cascading if/then/elsif, but is easier to just stack the if/then's rather like a case statement'
+
+
+ % if ($ex1_data->{trt} eq "PARAMS") {
+ %= include 'partials/_ex1_PARAMS'
+ %}
+
+
+ % if ($ex1_data->{trt} eq "TABLE") {
+ %= include 'partials/_ex1_TABLE'
+ %}
+
+
+
+
+%end
\ No newline at end of file
diff --git a/Targets/Example1/AdminLTE/example1.js b/Targets/Example1/AdminLTE/example1.js
new file mode 100644
index 0000000..49ddfcb
--- /dev/null
+++ b/Targets/Example1/AdminLTE/example1.js
@@ -0,0 +1,5 @@
+//
+//Generated by: SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-09-06 06:03:54
+//
+$(document).ready(function() {
+});
diff --git a/Targets/Example1/Example1-Custom.pm b/Targets/Example1/Example1-Custom.pm
new file mode 100644
index 0000000..64c8059
--- /dev/null
+++ b/Targets/Example1/Example1-Custom.pm
@@ -0,0 +1,192 @@
+#
+# Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-09-06 06:03:54
+#
+#
+# Routines to be edited by the developer to provide content and validation for parameters
+# and provison of the control data for table(s)
+#
+use esmith::util;
+use esmith::util::network;
+use esmith::ConfigDB::UTF8;
+use esmith::AccountsDB;
+use esmith::NetworksDB::UTF8;
+use esmith::HostsDB;
+use esmith::DomainsDB::UTF8;
+
+use constant FALSE => 0;
+use constant TRUE => 1;
+
+
+#The most common ones - open DB when required.
+#my $cdb;
+#my $adb;
+#my $ndb;
+#my $hdb;
+#my $ddb;
+
+#The most common ones - you might want to use these if you need to make sure that the DB is refreshed.
+#$cdb = esmith::ConfigDB::UTF8->open() || die("Couldn't open config db");
+#$adb = esmith::AccountsDB->open() || die("Couldn't open Accounts db");
+#$ndb = esmith::NetworksDB->open() || die("Couldn't open Network db");
+#$hdb = esmith::HostsDB::UTF8->open() || die("Couldn't open Hosts db");
+#$ddb = esmith::DomainsDB::UTF8->open() || die("Couldn't open Domains db");
+
+
+# Validation routines - parameters for each panel
+
+ sub validate_PARAMS {
+ my $c = shift;
+ my $ex1_data = shift; #Data hash as parameter
+ # Validation for each field
+ my $ret = '';
+
+ if (! TRUE) #validate $c->param('IbayName')
+ {$ret .= 'Validation for IbayName failed';}
+ if (! TRUE) #validate $c->param('ShareOwnerGrp')
+ {$ret .= 'Validation for ShareOwnerGrp failed';}
+ if ($ret eq '') {$ret = 'ok';}
+ return $ret;
+ }
+
+ sub validate_TABLE {
+ my $c = shift;
+ my $ex1_data = shift; #Data hash as parameter
+ # Validation for each field
+ my $ret = '';
+
+ if ($ret eq '') {$ret = 'ok';}
+ return $ret;
+ }
+
+
+# Get singleton data for each panel
+
+ sub get_data_for_panel_PARAMS {
+ # Return a hash with the fields required which will be loaded into the shared data
+ my $c = shift;
+ my %ret = (
+ 'Data1'=>'Data for PARAMS', #Example
+ # fields from Inputs in PARAMS $fields['PARAMS']
+ 'IbayName'=>'IbayName contents',
+ 'ShareOwnerGrp'=>'ShareOwnerGrp contents',
+
+ );
+ return %ret;
+ }
+
+ sub get_data_for_panel_TABLE {
+ # Return a hash with the fields required which will be loaded into the shared data
+ my $c = shift;
+ my %ret = (
+ 'Data1'=>'Data for TABLE', #Example
+ # fields from Inputs in TABLE $fields['TABLE']
+
+ );
+ return %ret;
+ }
+
+
+
+# Get control data for table(s)
+
+ # Define a constant hash for field name mapping
+ use constant ibays_FIELD_MAPPING => (
+ 'Name' => 'Source-for-Name',
+ 'Description' => 'Source-for-Description',
+ 'flag' => 'Source-for-flag',
+ 'Modify' => 'Source-for-Modify'
+ #'target_field2' => 'source_field2',
+ # Add more mappings as needed
+ );
+
+sub actual_ibays {
+ my $c = shift;
+ my @ret = ();
+ # Actual code for extracting ibays
+ return @ret;
+}
+
+sub get_ibays {
+ # Return an array of hashes of the contents for each row and column for ibays
+ my $c = shift;
+ my @source_records = $c->actual_ibays();
+ my @transformed_records;
+ my %Field_Mapping = ibays_FIELD_MAPPING();
+ # Iterate over each record in the source array
+ for my $source_record (@source_records) {
+ my %transformed_record;
+ # Iterate over each key-value pair in the $Field_Mapping constant
+ while (my ($target, $source) = each %Field_Mapping) {
+ # Check if the source field exists in the source record
+ if (exists $source_record->{$source}) {
+ # Assign the source field value to the target field in the transformed record
+ $transformed_record{$target} = $source_record->{$source};
+ }
+ }
+ # Add transformed record to the array if it's not empty
+ push @transformed_records, \%transformed_record if %transformed_record;
+ }
+ return \@transformed_records;
+}
+
+
+
+# Return hash with values from row in which link clicked on table
+
+ sub get_selected_PARAMS {
+ my $c = shift;
+ my $selected = shift; #Parameter is name of selected row.
+ my $is_new_record = shift; #Indicates new record required (defaults)
+ my %ret = ();
+ #gather the values here
+ return %ret;
+ }
+
+ sub get_selected_TABLE {
+ my $c = shift;
+ my $selected = shift; #Parameter is name of selected row.
+ my $is_new_record = shift; #Indicates new record required (defaults)
+ my %ret = ();
+ #gather the values here
+ return %ret;
+ }
+
+
+#after sucessful modify or create or whatever and submit then perfom (if the params validate)
+
+ sub perform_PARAMS {
+ my $c = shift;
+ my $ex1_data = shift; #Data hash as parameter
+ my $ret = '';
+ my $db = $cdb; #maybe one of the others
+ my $dbkey = 'ChangeThis';
+ # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g."
+
+ if (! TRUE) #copy or perform with value: IbayName e.g. $db->set_prop($dbkey,'IbayName',$c->param('IbayName'),type=>'service'))
+ {$ret .= 'Perform/save failed for IbayName';}
+ if (! TRUE) #copy or perform with value: ShareOwnerGrp e.g. $db->set_prop($dbkey,'ShareOwnerGrp',$c->param('ShareOwnerGrp'),type=>'service'))
+ {$ret .= 'Perform/save failed for ShareOwnerGrp';}
+ if ($ret eq '') {$ret = 'ok';}
+ return $ret;
+ }
+
+ sub perform_TABLE {
+ my $c = shift;
+ my $ex1_data = shift; #Data hash as parameter
+ my $ret = '';
+ my $db = $cdb; #maybe one of the others
+ my $dbkey = 'ChangeThis';
+ # To make it write to DB as comment, delete this (regex) string in each if statement "TRUE\) \#copy or perform with value: .* e.g."
+
+ if ($ret eq '') {$ret = 'ok';}
+ return $ret;
+ }
+
+
+sub create_link{
+ # WIP
+ my ($c,$route, $panel, $index) = @_;
+ my $link = "$route?trt=$panel&Selected=$index";
+ return $link;
+}
+1;
\ No newline at end of file
diff --git a/Targets/Example1/Example1.pm b/Targets/Example1/Example1.pm
new file mode 100644
index 0000000..2461f35
--- /dev/null
+++ b/Targets/Example1/Example1.pm
@@ -0,0 +1,321 @@
+package SrvMngr::Controller::Example1;
+#
+# Generated by SM2Gen version:0.9(20Jan2025) Chameleon version:4.5.4 On Python:3.12.3 at 2025-09-06 06:03:54
+# Remember that each route must be unique (else they just overwrite each other).
+# you cannot have get and post on the same name and url.
+#
+#----------------------------------------------------------------------
+# heading : Network
+# description : Example 1
+# navigation : 2000 400
+#
+# name : example1, method : get, url : /example1, ctlact : Example1#main
+# name : example1u, method : post, url : /example1u, ctlact : Example1#do_update
+# name : example1d, method : get, url : /example1d, ctlact : Example1#do_display
+#
+# routes : end
+#
+# Documentation: https://wiki.contribs.org/Example1
+#----------------------------------------------------------------------
+
+#
+# Scheme of things:
+#
+# TBA!!
+
+use strict;
+use warnings;
+use Mojo::Base 'Mojolicious::Controller';
+
+use constant FALSE => 0;
+use constant TRUE => 1;
+
+use Locale::gettext;
+use SrvMngr::I18N;
+use SrvMngr qw(theme_list init_session);
+
+use Data::Dumper;
+
+use esmith::util;
+use esmith::util::network;
+use esmith::ConfigDB::UTF8;
+use esmith::AccountsDB;
+use esmith::NetworksDB::UTF8;
+use esmith::HostsDB;
+use esmith::DomainsDB::UTF8;
+
+our $cdb;
+our $adb;
+our $ndb;
+our $hdb;
+our $ddb;
+
+our %ex1_data;
+
+require '/usr/share/smanager/lib/SrvMngr/Controller/Example1-Custom.pm'; #The code that is to be added by the developer
+
+sub main {
+#
+# Initial entry - route is "/