diff --git a/meta/io.murano/Classes/SharedIp.yaml b/meta/io.murano/Classes/SharedIp.yaml
new file mode 100644
index 00000000..a1d8f998
--- /dev/null
+++ b/meta/io.murano/Classes/SharedIp.yaml
@@ -0,0 +1,94 @@
+Namespaces:
+  =: io.murano
+
+Name: SharedIp
+
+Properties:
+  assignFloatingIp:
+    Contract: $.bool().notNull()
+    Default: false
+  virtualIp:
+    Contract: $.string()
+    Usage: Out
+  floatingIpAddress:
+    Contract: $.string()
+    Usage: Out
+
+Workflow:
+  initialize:
+    Body:
+      - $.environment: $.find(Environment).require()
+      - $.network: $.environment.defaultNetworks.environment
+      - $.instances: []
+
+  deploy:
+    Body:
+      - If: not $.getAttr(deployed, false)
+        Then:
+          - $reporter: $.environment.reporter
+          - $.network.deploy()
+          - $aapPortName: format('AllowedAddressPairsPort-{0}', $.id())
+          - $template:
+              heat_template_version: '2013-05-23'
+              resources:
+                $aapPortName:
+                  type: 'OS::Neutron::Port'
+                  properties:
+                    network_id:
+                      get_resource: $.network.name + '-net-' + $.network.id()
+                    fixed_ips:
+                      - subnet_id:
+                          get_resource: $.network.name + '-subnet-' + $.network.id()
+              outputs:
+                $aapPortName+'-virtualIp':
+                  value:
+                    get_attr: [$aapPortName, fixed_ips, 0, ip_address]
+                  description: format('SharedIP Address of SharedIp group {0}', $.id())
+          - $.environment.stack.updateTemplate($template)
+          - If: $.assignFloatingIp
+            Then:
+              - $extNetId: $.network.getExternalNetId()
+              - $fip_name: format('Shared-Floating-ip-{0}', $.id())
+              - $fip_assoc_name: format('Shared-Floating-ip-assoc-{0}', $.id())
+              - $template:
+                  resources:
+                    $fip_name:
+                      type: 'OS::Neutron::FloatingIP'
+                      properties:
+                        floating_network_id: $extNetId
+                    $fip_assoc_name:
+                      type: 'OS::Neutron::FloatingIPAssociation'
+                      properties:
+                        floatingip_id:
+                          get_resource: $fip_name
+                        port_id:
+                          get_resource: $aapPortName
+                  outputs:
+                    $fip_name + '-val':
+                      value:
+                        get_attr: [$fip_name, floating_ip_address]
+                      description: Shared Floating IP assigned
+              - $.environment.stack.updateTemplate($template)
+
+          - $reporter.report($this, 'Allocating shared ip address')
+          - $.environment.stack.push()
+          - $outputs: $.environment.stack.output()
+          - $.virtualIp: $outputs.get(format('AllowedAddressPairsPort-{0}-virtualIp', $.id()))
+          - $.floatingIpAddress: $outputs.get(format('Shared-Floating-ip-{0}-val', $.id()))
+          - $reporter.report($this, format('Shared IP allocated at {0}', $.virtualIp))
+          - If: $.assignFloatingIp
+            Then:
+              - $reporter.report($this, format('Floating shared IP is {0}', $.floatingIpAddress))
+          - $.setAttr(deployed, true)
+
+
+  getSharedIpRef:
+    Body:
+      - $aapPortName: format('AllowedAddressPairsPort-{0}', $.id())
+      - Return:
+          get_attr: [$aapPortName, fixed_ips, 0, ip_address]
+
+
+
+
+
diff --git a/meta/io.murano/Classes/resources/Instance.yaml b/meta/io.murano/Classes/resources/Instance.yaml
index 346c231d..0c81905d 100644
--- a/meta/io.murano/Classes/resources/Instance.yaml
+++ b/meta/io.murano/Classes/resources/Instance.yaml
@@ -44,6 +44,10 @@ Properties:
   securityGroupName:
     Contract: $.string()
     Default: null
+  sharedIps:
+    Contract:
+      - $.class(std:SharedIp)
+    Usage: InOut  # as it is set in setSharedIps
 
 Methods:
   initialize:
@@ -52,6 +56,14 @@ Methods:
       - $.agent: new(sys:Agent, host => $)
       - $.resources: new(sys:Resources)
 
+  setSharedIps:
+    Arguments:
+      ips:
+        Contract:
+          - $.class(std:SharedIp)
+    Body:
+      $.sharedIps: $ips
+
   deploy:
     Body:
       - $securityGroupName: coalesce(
@@ -60,6 +72,7 @@ Methods:
           )
       - $.createDefaultInstanceSecurityGroupRules($securityGroupName)
       - $.detectPrimaryNetwork()
+      - $.ensureSharedIpsDeployed()
       - $.ensureNetworksDeployed()
       - If: $.networks.useEnvironmentNetwork and $.environment.defaultNetworks.environment!=null
         Then:
@@ -118,6 +131,10 @@ Methods:
           - $.environment.defaultNetworks.flat.deploy()
       - $.networks.customNetworks.pselect($.deploy())
 
+  ensureSharedIpsDeployed:
+    Body:
+      - $.sharedIps.pselect($.deploy())
+
   joinNet:
     Arguments:
       - net:
@@ -159,6 +176,19 @@ Methods:
                       get_resource: $portname
       - $.environment.stack.updateTemplate($template)
 
+      - If: $primary
+        Then:
+          - For: sip
+            In: $.sharedIps
+            Do:
+              - $template:
+                  resources:
+                    $portname:
+                      properties:
+                        allowed_address_pairs:
+                          - ip_address: $sip.getSharedIpRef()
+              - $.environment.stack.updateTemplate($template)
+
       - If: $assignFip
         Then:
           - $extNetId: $net.getExternalNetId()
diff --git a/meta/io.murano/Classes/resources/NeutronNetwork.yaml b/meta/io.murano/Classes/resources/NeutronNetwork.yaml
index 63df7867..da6aca3e 100644
--- a/meta/io.murano/Classes/resources/NeutronNetwork.yaml
+++ b/meta/io.murano/Classes/resources/NeutronNetwork.yaml
@@ -62,7 +62,7 @@ Methods:
               - $.createRouterInterface()
 
           - $.environment.stack.push()
-          - $.setAttr(networkConfigured, true)
+          - $.setAttr(deployed, true)
 
   createNetwork:
     Body:
diff --git a/meta/io.murano/Classes/resources/WindowsInstance.yaml b/meta/io.murano/Classes/resources/WindowsInstance.yaml
index 4e31c59b..212d79c0 100644
--- a/meta/io.murano/Classes/resources/WindowsInstance.yaml
+++ b/meta/io.murano/Classes/resources/WindowsInstance.yaml
@@ -1,6 +1,7 @@
 Namespaces:
   =: io.murano.resources
   std: io.murano
+  sys: io.murano.system
 
 Name: WindowsInstance
 
diff --git a/meta/io.murano/manifest.yaml b/meta/io.murano/manifest.yaml
index 04464f42..efa6ccd8 100644
--- a/meta/io.murano/manifest.yaml
+++ b/meta/io.murano/manifest.yaml
@@ -17,6 +17,7 @@ Classes:
   io.murano.Object: Object.yaml
   io.murano.Environment: Environment.yaml
   io.murano.Application: Application.yaml
+  io.murano.SharedIp: SharedIp.yaml
 
   io.murano.system.SecurityGroupManager: SecurityGroupManager.yaml