workaround for Tosca bug
diff --git a/xos/tosca/custom_types/xos.yaml b/xos/tosca/custom_types/xos.yaml
index 044f281..b102b2a 100644
--- a/xos/tosca/custom_types/xos.yaml
+++ b/xos/tosca/custom_types/xos.yaml
@@ -1,269 +1 @@
-tosca_definitions_version: tosca_simple_yaml_1_0
-
-node_types:
-    # I wanted to make this the base of all XOS node types, but doing so throws
-    # InvalidTypeError: Type "tosca.nodes.XOS" is not a valid type
-    tosca.nodes.XOS:
-        derived_from: tosca.nodes.Root
-        properties:
-            no-delete:
-                type: boolean
-                default: false
-                description: do not allow Tosca to delete this object
-            no-create:
-                type: boolean
-                default: false
-                description: do not allow Tosca to create this object
-
-    tosca.nodes.Service:
-        derived_from: tosca.nodes.Root
-        capabilities:
-            scalable:
-                type: tosca.capabilities.Scalable
-            service:
-                type: tosca.capabilities.xos.Service
-#        properties:
-#            persistent:
-#                type: boolean
-#                required: false
-#                default: false
-#                description: prevent this resource from being deleted
-
-    tosca.nodes.User:
-        derived_from: tosca.nodes.Root
-
-        capabilities:
-            user:
-                type: tosca.capabilities.xos.User
-
-        properties:
-            password:
-                type: string
-                required: true
-            firstname:
-                type: string
-                required: true
-            lastname:
-                type: string
-                required: true
-            phone:
-                type: string
-                required: false
-            user_url:
-                type: string
-                required: false
-            public_key:
-                type: string
-                required: false
-            is_active:
-                type: boolean
-                default: true
-            is_admin:
-                type: boolean
-                default: false
-            login_page:
-                type: string
-                required: false
-
-    tosca.nodes.NetworkTemplate:
-        derived_from: tosca.nodes.Root
-
-        capabilities:
-            network_template:
-                type: tosca.capabilities.xos.NetworkTemplate
-
-        properties:
-            visibility:
-                type: string
-                default: private
-            translation:
-                type: string
-                default: none
-            shared_network_name:
-                type: string
-                required: false
-            shared_network_id:
-                type: string
-                required: false
-            topology_kind:
-                type: string
-                default: BigSwitch
-            controller_kind:
-                type: string
-                required: false
-
-    tosca.nodes.XOSNetwork:
-        derived_from: tosca.nodes.Root
-
-        capabilities:
-            network:
-                type: tosca.capabilities.xos.Network
-
-        properties:
-            ports:
-                type: string
-                required: false
-            labels:
-                type: string
-                required: false
-            permit_all_slices:
-                type: boolean
-                default: false
-            permitted_slices:
-                type: string
-                required: false
-
-    tosca.nodes.Deployment:
-        derived_from: tosca.nodes.Root
-        capabilities:
-            deployment:
-                type: tosca.capabilities.xos.Deployment
-
-    tosca.nodes.Controller:
-        derived_from: tosca.nodes.Root
-        capabilities:
-            controller:
-                type: tosca.capabilities.xos.Controller
-        properties:
-            backend_type:
-                type: string
-                required: false
-            version:
-                type: string
-                required: false
-            auth_url:
-                type: string
-                required: false
-            admin_user:
-                type: string
-                required: false
-            admin_password:
-                type: string
-                required: false
-            admin_tenant:
-                type: string
-                required: false
-            domain:
-                type: string
-                required: false
-
-    tosca.nodes.Site:
-        derived_from: tosca.nodes.Root
-        capabilities:
-            site:
-                type: tosca.capabilities.xos.Site
-        properties:
-             display_name:
-                 type: string
-                 required: false
-                 description: name of the site
-             site_url:
-                 type: string
-                 required: false
-             enabled:
-                 type: boolean
-                 default: true
-             hosts_nodes:
-                 type: boolean
-                 default: true
-             hosts_users:
-                 type: boolean
-                 default: true
-             is_public:
-                 type: boolean
-                 default: true
-             # location, longitude, latitude
-
-    tosca.nodes.Slice:
-        derived_from: tosca.nodes.Root
-        capability:
-            slice:
-                type: tosca.capabilities.xos.Slice
-
-    tosca.relationships.MemberOfSlice:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.Slice ]
-
-    tosca.relationships.MemberOfService:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.Service ]
-
-    tosca.relationships.MemberOfSite:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.Site ]
-
-    tosca.relationships.TenantOfService:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.Service ]
-
-    tosca.relationships.ControllerDeployment:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.Deployment ]
-
-    tosca.relationships SiteDeployment:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.Deployment ]
-
-    tosca.relationships.UsesController:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.Controller ]
-
-    tosca.relationships.ConnectsToNetwork:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.Network ]
-
-#    tosca.relationships.OwnsNetwork:
-#        derived_from: tosca.relationships.Root
-#        valid_target_types: [ tosca.capabilities.xos.Network ]
-
-    tosca.relationships.UsesNetworkTemplate:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.NetworkTemplate ]
-
-    tosca.relationships.AdminPrivilege:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.Slice, tosca.capabiltys.xos.Site ]
-
-    tosca.relationships.AccessPrivilege:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabilities.xos.Slice, tosca.capabiltys.xos.Site ]
-
-    tosca.relationships.PIPrivilege:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabiltys.xos.Site ]
-
-    tosca.relationships.TechPrivilege:
-        derived_from: tosca.relationships.Root
-        valid_target_types: [ tosca.capabiltys.xos.Site ]
-
-    tosca.capabilities.xos.Service:
-        derived_from: tosca.capabilities.Root
-        description: An XOS Service
-
-    tosca.capabilities.xos.Deployment:
-        derived_from: tosca.capabilities.Root
-        description: An XOS Deployment
-
-    tosca.capabilities.xos.Controller:
-        derived_from: tosca.capabilities.Root
-        description: An XOS Controller
-
-    tosca.capabilities.xos.Site:
-        derived_from: tosca.capabilities.Root
-        description: An XOS Site
-
-    tosca.capabilities.xos.Slice:
-        derived_from: tosca.capabilities.Root
-        description: An XOS Slice
-
-    tosca.capabilities.xos.NetworkTemplate:
-        derived_from: tosca.capabilities.Root
-        description: An XOS network template
-
-    tosca.capabilities.xos.Network:
-        derived_from: tosca.capabilities.Root
-        description: An XOS network
-
-    tosca.capabilities.xos.User:
-        derived_from: tosca.capabilities.Root
-        description: An XOS user
+# this file intentionally left blank
diff --git a/xos/tosca/definitions/TOSCA_definition_1_0.yaml b/xos/tosca/definitions/TOSCA_definition_1_0.yaml
new file mode 100644
index 0000000..c21f0bc
--- /dev/null
+++ b/xos/tosca/definitions/TOSCA_definition_1_0.yaml
@@ -0,0 +1,721 @@
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+##########################################################################
+# The content of this file reflects TOSCA Simple Profile in YAML version
+# 1.0.0. It describes the definition for TOSCA types including Node Type,
+# Relationship Type, Capability Type and Interfaces.
+##########################################################################
+tosca_definitions_version: tosca_simple_yaml_1_0
+
+##########################################################################
+# Node Type.
+# A Node Type is a reusable entity that defines the type of one or more
+# Node Templates.
+##########################################################################
+tosca.nodes.Root:
+  description: >
+    The TOSCA root node all other TOSCA base node types derive from.
+  attributes:
+    tosca_id:
+      type: string
+    tosca_name:
+      type: string
+    state:
+      type: string
+    capabilities:
+      feature:
+        type: tosca.capabilities.Node
+  requirements:
+    - dependency:
+        capability: tosca.capabilities.Node
+        node: tosca.nodes.Root
+        relationship: tosca.relationships.DependsOn
+        occurrences: [ 0, UNBOUNDED ]
+  interfaces:
+    Standard:
+      type: tosca.interfaces.node.lifecycle.Standard
+
+tosca.nodes.Compute:
+  derived_from: tosca.nodes.Root
+  attributes:
+    private_address:
+      type: string
+    public_address:
+      type: string
+  capabilities:
+      host:
+         type: tosca.capabilities.Container
+      binding:
+         type: tosca.capabilities.network.Bindable
+      os:
+         type: tosca.capabilities.OperatingSystem
+      scalable:
+         type: tosca.capabilities.Scalable
+  requirements:
+    - local_storage:
+        capability: tosca.capabilities.Attachment
+        node: tosca.nodes.BlockStorage
+        relationship: tosca.relationships.AttachesTo
+        occurrences: [0, UNBOUNDED]
+
+tosca.nodes.SoftwareComponent:
+  derived_from: tosca.nodes.Root
+  properties:
+    # domain-specific software component version
+    component_version:
+      type: version
+      required: false
+      description: >
+        Software component version.
+    admin_credential:
+      type: tosca.datatypes.Credential
+      required: false
+  requirements:
+    - host:
+        capability: tosca.capabilities.Container
+        node: tosca.nodes.Compute
+        relationship: tosca.relationships.HostedOn
+
+tosca.nodes.DBMS:
+  derived_from: tosca.nodes.SoftwareComponent
+  properties:
+    port:
+      required: no
+      type: integer
+      description: >
+        The port the DBMS service will listen to for data and requests.
+    root_password:
+      required: no
+      type: string
+      description: >
+        The root password for the DBMS service.
+  capabilities:
+    host:
+      type: tosca.capabilities.Container
+      valid_source_types: [tosca.nodes.Database]
+
+tosca.nodes.Database:
+  derived_from: tosca.nodes.Root
+  properties:
+    user:
+      required: no
+      type: string
+      description: >
+        User account name for DB administration
+    name:
+      required: no
+      type: string
+      description: >
+        The name of the database.
+    password:
+      required: no
+      type: string
+      description: >
+        The password for the DB user account
+  requirements:
+    - host:
+        capability: tosca.capabilities.Container
+        node: tosca.nodes.DBMS
+        relationship: tosca.relationships.HostedOn
+  capabilities:
+    database_endpoint:
+      type: tosca.capabilities.Endpoint.Database
+
+tosca.nodes.WebServer:
+  derived_from: tosca.nodes.SoftwareComponent
+  capabilities:
+    data_endpoint:
+      type: tosca.capabilities.Endpoint
+    admin_endpoint:
+      type: tosca.capabilities.Endpoint.Admin
+    host:
+      type: tosca.capabilities.Container
+      valid_source_types: [tosca.nodes.WebApplication]
+
+tosca.nodes.WebApplication:
+  derived_from: tosca.nodes.Root
+  properties:
+    context_root:
+      type: string
+      required: false
+  requirements:
+    - host:
+        capability: tosca.capabilities.Container
+        node: tosca.nodes.WebServer
+        relationship: tosca.relationships.HostedOn
+  capabilities:
+    app_endpoint:
+      type: tosca.capabilities.Endpoint
+
+tosca.nodes.BlockStorage:
+  derived_from: tosca.nodes.Root
+  properties:
+    size:
+      type: integer
+      constraints:
+        - greater_or_equal: 1
+    volume_id:
+      type: string
+      required: false
+    snapshot_id:
+      type: string
+      required: false
+  attributes:
+    volume_id:
+      type: string
+  capabilities:
+    attachment:
+      type: tosca.capabilities.Attachment
+
+tosca.nodes.network.Network:
+  derived_from: tosca.nodes.Root
+  description: >
+    The TOSCA Network node represents a simple, logical network service.
+  properties:
+    ip_version:
+      type: integer
+      required: no
+      default: 4
+      constraints:
+        - valid_values: [ 4, 6 ]
+      description: >
+        The IP version of the requested network. Valid values are 4 for ipv4
+        or 6 for ipv6.
+    cidr:
+      type: string
+      required: no
+      description: >
+        The cidr block of the requested network.
+    start_ip:
+      type: string
+      required: no
+      description: >
+         The IP address to be used as the start of a pool of addresses within
+         the full IP range derived from the cidr block.
+    end_ip:
+      type: string
+      required: no
+      description: >
+          The IP address to be used as the end of a pool of addresses within
+          the full IP range derived from the cidr block.
+    gateway_ip:
+      type: string
+      required: no
+      description: >
+         The gateway IP address.
+    network_name:
+      type: string
+      required: no
+      description: >
+         An identifier that represents an existing Network instance in the
+         underlying cloud infrastructure or can be used as the name of the
+         newly created network. If network_name is provided and no other
+         properties are provided (with exception of network_id), then an
+         existing network instance will be used. If network_name is provided
+         alongside with more properties then a new network with this name will
+         be created.
+    network_id:
+      type: string
+      required: no
+      description: >
+         An identifier that represents an existing Network instance in the
+         underlying cloud infrastructure. This property is mutually exclusive
+         with all other properties except network_name. This can be used alone
+         or together with network_name to identify an existing network.
+    segmentation_id:
+      type: string
+      required: no
+      description: >
+         A segmentation identifier in the underlying cloud infrastructure.
+         E.g. VLAN ID, GRE tunnel ID, etc..
+    dhcp_enabled:
+      type: boolean
+      required: no
+      default: true
+      description: >
+        Indicates should DHCP service be enabled on the network or not.
+  capabilities:
+    link:
+      type: tosca.capabilities.network.Linkable
+
+tosca.nodes.network.Port:
+  derived_from: tosca.nodes.Root
+  description: >
+    The TOSCA Port node represents a logical entity that associates between
+    Compute and Network normative types. The Port node type effectively
+    represents a single virtual NIC on the Compute node instance.
+  properties:
+    ip_address:
+      type: string
+      required: no
+      description: >
+        Allow the user to set a static IP.
+    order:
+      type: integer
+      required: no
+      default: 0
+      constraints:
+        - greater_or_equal: 0
+      description: >
+        The order of the NIC on the compute instance (e.g. eth2).
+    is_default:
+      type: boolean
+      required: no
+      default: false
+      description: >
+        If is_default=true this port will be used for the default gateway
+        route. Only one port that is associated to single compute node can
+        set as is_default=true.
+    ip_range_start:
+      type: string
+      required: no
+      description: >
+        Defines the starting IP of a range to be allocated for the compute
+        instances that are associated with this Port.
+    ip_range_end:
+      type: string
+      required: no
+      description: >
+        Defines the ending IP of a range to be allocated for the compute
+        instances that are associated with this Port.
+  attributes:
+    ip_address:
+      type: string
+  requirements:
+    - binding:
+        description: >
+          Binding requirement expresses the relationship between Port and
+          Compute nodes. Effectevely it indicates that the Port will be
+          attached to specific Compute node instance
+        capability: tosca.capabilities.network.Bindable
+        relationship: tosca.relationships.network.BindsTo
+    - link:
+        description: >
+          Link requirement expresses the relationship between Port and Network
+          nodes. It indicates which network this port will connect to.
+        capability: tosca.capabilities.network.Linkable
+        relationship: tosca.relationships.network.LinksTo
+
+tosca.nodes.ObjectStorage:
+  derived_from: tosca.nodes.Root
+  description: >
+    The TOSCA ObjectStorage node represents storage that provides the ability
+    to store data as objects (or BLOBs of data) without consideration for the
+    underlying filesystem or devices
+  properties:
+    name:
+      type: string
+      required: yes
+      description: >
+        The logical name of the object store (or container).
+    size:
+      type: scalar-unit.size
+      required: no
+      constraints:
+        - greater_or_equal: 0 GB
+      description: >
+        The requested initial storage size.
+    maxsize:
+      type: scalar-unit.size
+      required: no
+      constraints:
+        - greater_or_equal: 0 GB
+      description: >
+        The requested maximum storage size.
+  capabilities:
+    storage_endpoint:
+      type: tosca.capabilities.Endpoint
+
+##########################################################################
+# Relationship Type.
+# A Relationship Type is a reusable entity that defines the type of one
+# or more relationships between Node Types or Node Templates.
+##########################################################################
+tosca.relationships.Root:
+  description: >
+    The TOSCA root Relationship Type all other TOSCA base Relationship Types
+    derive from.
+  attributes:
+    tosca_id:
+      type: string
+    tosca_name:
+      type: string
+  interfaces:
+    Configure:
+      type: tosca.interfaces.relationship.Configure
+
+tosca.relationships.DependsOn:
+  derived_from: tosca.relationships.Root
+
+tosca.relationships.HostedOn:
+  derived_from: tosca.relationships.Root
+  valid_target_types: [ tosca.capabilities.Container ]
+
+tosca.relationships.ConnectsTo:
+  derived_from: tosca.relationships.Root
+  valid_target_types: [ tosca.capabilities.Endpoint ]
+  credential:
+    type: tosca.datatypes.Credential
+    required: false
+
+tosca.relationships.AttachesTo:
+  derived_from: tosca.relationships.Root
+  valid_target_types: [ tosca.capabilities.Attachment ]
+  properties:
+    location:
+      required: true
+      type: string
+      constraints:
+        - min_length: 1
+    device:
+      required: false
+      type: string
+
+tosca.relationships.network.LinksTo:
+  derived_from: tosca.relationships.DependsOn
+  valid_target_types: [ tosca.capabilities.network.Linkable ]
+
+tosca.relationships.network.BindsTo:
+  derived_from: tosca.relationships.DependsOn
+  valid_target_types: [ tosca.capabilities.network.Bindable ]
+
+##########################################################################
+# Capability Type.
+# A Capability Type is a reusable entity that describes a kind of
+# capability that a Node Type can declare to expose.
+##########################################################################
+tosca.capabilities.Root:
+  description: >
+    The TOSCA root Capability Type all other TOSCA base Capability Types
+    derive from.
+
+tosca.capabilities.Node:
+  derived_from: tosca.capabilities.Root
+
+tosca.capabilities.Container:
+  derived_from: tosca.capabilities.Root
+  properties:
+    num_cpus:
+      required: no
+      type: integer
+      constraints:
+        - greater_or_equal: 1
+    cpu_frequency:
+      required: no
+      type: scalar-unit.frequency
+      constraints:
+        - greater_or_equal: 0.1 GHz
+    disk_size:
+      required: no
+      type: scalar-unit.size
+      constraints:
+        - greater_or_equal: 0 MB
+    mem_size:
+      required: no
+      type: scalar-unit.size
+      constraints:
+        - greater_or_equal: 0 MB
+
+tosca.capabilities.Endpoint:
+  derived_from: tosca.capabilities.Root
+  properties:
+    protocol:
+      type: string
+      default: tcp
+    port:
+      type: tosca.datatypes.network.PortDef
+      required: false
+    secure:
+      type: boolean
+      default: false
+    url_path:
+      type: string
+      required: false
+    port_name:
+      type: string
+      required: false
+    network_name:
+      type: string
+      required: false
+    initiator:
+      type: string
+      default: source
+      constraints:
+        - valid_values: [source, target, peer]
+    ports:
+      type: map
+      required: false
+      constraints:
+        - min_length: 1
+      entry_schema:
+        type: tosca.datatypes.network.PortDef
+  attributes:
+    public_address:
+      type: string
+    private_address:
+      type: string
+
+tosca.capabilities.Endpoint.Admin:
+  derived_from: tosca.capabilities.Endpoint
+  properties:
+    secure: true
+
+tosca.capabilities.Scalable:
+  derived_from: tosca.capabilities.Root
+  properties:
+    min_instances:
+      type: integer
+      required: yes
+      default: 1
+      description: >
+        This property is used to indicate the minimum number of instances
+        that should be created for the associated TOSCA Node Template by
+        a TOSCA orchestrator.
+    max_instances:
+      type: integer
+      required: yes
+      default: 1
+      description: >
+        This property is used to indicate the maximum number of instances
+        that should be created for the associated TOSCA Node Template by
+        a TOSCA orchestrator.
+    default_instances:
+      type: integer
+      required: no
+      description: >
+        An optional property that indicates the requested default number
+        of instances that should be the starting number of instances a
+        TOSCA orchestrator should attempt to allocate.
+        The value for this property MUST be in the range between the values
+        set for min_instances and max_instances properties.
+
+tosca.capabilities.Endpoint.Database:
+  derived_from: tosca.capabilities.Endpoint
+
+tosca.capabilities.Attachment:
+  derived_from: tosca.capabilities.Root
+
+tosca.capabilities.network.Linkable:
+  derived_from: tosca.capabilities.Root
+  description: >
+    A node type that includes the Linkable capability indicates that it can
+    be pointed by tosca.relationships.network.LinksTo relationship type, which
+    represents an association relationship between Port and Network node types.
+
+tosca.capabilities.network.Bindable:
+  derived_from: tosca.capabilities.Root
+  description: >
+    A node type that includes the Bindable capability indicates that it can
+    be pointed by tosca.relationships.network.BindsTo relationship type, which
+    represents a network association relationship between Port and Compute node
+    types.
+
+tosca.capabilities.OperatingSystem:
+  derived_from: tosca.capabilities.Root
+  properties:
+    architecture:
+      required: yes
+      default: x86_64
+      type: string
+      description: >
+        The host Operating System (OS) architecture.
+    type:
+      required: yes
+      type: string
+      description: >
+        The host Operating System (OS) type.
+    distribution:
+      required: no
+      type: string
+      description: >
+        The host Operating System (OS) distribution. Examples of valid values
+        for an “type” of “Linux” would include:
+        debian, fedora, rhel and ubuntu.
+    version:
+      required: no
+      type: string
+      description: >
+        The host Operating System version.
+
+##########################################################################
+ # Interfaces Type.
+ # The Interfaces element describes a list of one or more interface
+ # definitions for a modelable entity (e.g., a Node or Relationship Type)
+ # as defined within the TOSCA Simple Profile specification.
+##########################################################################
+tosca.interfaces.node.lifecycle.Standard:
+  create:
+    description: Standard lifecycle create operation.
+  configure:
+    description: Standard lifecycle configure operation.
+  start:
+    description: Standard lifecycle start operation.
+  stop:
+    description: Standard lifecycle stop operation.
+  delete:
+    description: Standard lifecycle delete operation.
+
+tosca.interfaces.relationship.Configure:
+  pre_configure_source:
+    description: Operation to pre-configure the source endpoint.
+  pre_configure_target:
+    description: Operation to pre-configure the target endpoint.
+  post_configure_source:
+    description: Operation to post-configure the source endpoint.
+  post_configure_target:
+    description: Operation to post-configure the target endpoint.
+  add_target:
+    description: Operation to add a target node.
+  remove_target:
+    description: Operation to remove a target node.
+  add_source: >
+    description: Operation to notify the target node of a source node which
+    is now available via a relationship.
+    description:
+  target_changed: >
+    description: Operation to notify source some property or attribute of the
+    target changed
+
+##########################################################################
+ # Data Type.
+ # A Datatype is a complex data type declaration which contains other
+ # complex or simple data types.
+##########################################################################
+tosca.datatypes.network.NetworkInfo:
+  properties:
+    network_name:
+      type: string
+    network_id:
+      type: string
+    addresses:
+      type: list
+      entry_schema:
+        type: string
+
+tosca.datatypes.network.PortInfo:
+  properties:
+    port_name:
+      type: string
+    port_id:
+      type: string
+    network_id:
+      type: string
+    mac_address:
+      type: string
+    addresses:
+      type: list
+      entry_schema:
+        type: string
+
+tosca.datatypes.network.PortDef:
+  type: integer
+  constraints:
+    - in_range: [ 1, 65535 ]
+
+tosca.datatypes.network.PortSpec:
+  properties:
+    protocol:
+      type: string
+      required: true
+      default: tcp
+      constraints:
+        - valid_values: [ udp, tcp, igmp ]
+    target:
+      type: list
+      entry_schema:
+        type: PortDef
+    target_range:
+      type: range
+      constraints:
+        - in_range: [ 1, 65535 ]
+    source:
+      type: list
+      entry_schema:
+        type: PortDef
+    source_range:
+      type: range
+      constraints:
+        - in_range: [ 1, 65535 ]
+
+tosca.datatypes.Credential:
+  properties:
+    protocol:
+      type: string
+    token_type:
+      type: string
+    token:
+      type: string
+    keys:
+      type: map
+      entry_schema:
+        type: string
+    user:
+      type: string
+      required: false
+
+##########################################################################
+ # Artifact Type.
+ # An Artifact Type is a reusable entity that defines the type of one or more
+ # files which Node Types or Node Templates can have dependent relationships
+ # and used during operations such as during installation or deployment.
+##########################################################################
+tosca.artifacts.Root:
+  description: >
+    The TOSCA Artifact Type all other TOSCA Artifact Types derive from
+  properties:
+    version: version
+
+tosca.artifacts.File:
+  derived_from: tosca.artifacts.Root
+
+tosca.artifacts.Deployment:
+  derived_from: tosca.artifacts.Root
+  description: TOSCA base type for deployment artifacts
+
+tosca.artifacts.Deployment.Image:
+  derived_from: tosca.artifacts.Deployment
+
+tosca.artifacts.Deployment.Image.VM:
+  derived_from: tosca.artifacts.Deployment.Image
+
+tosca.artifacts.Implementation:
+  derived_from: tosca.artifacts.Root
+  description: TOSCA base type for implementation artifacts
+
+tosca.artifacts.impl.Bash:
+  derived_from: tosca.artifacts.Implementation
+  description: Script artifact for the Unix Bash shell
+  mime_type: application/x-sh
+  file_ext: [ sh ]
+
+tosca.artifacts.impl.Python:
+  derived_from: tosca.artifacts.Implementation
+  description: Artifact for the interpreted Python language
+  mime_type: application/x-python
+  file_ext: [ py ]
+
+tosca.artifacts.Deployment.Image.Container.Docker:
+  derived_from: tosca.artifacts.Deployment.Image
+  description: Docker container image
+
+tosca.artifacts.Deployment.Image.VM.ISO:
+  derived_from: tosca.artifacts.Deployment.Image
+  description: Virtual Machine (VM) image in ISO disk format
+  mime_type: application/octet-stream
+  file_ext: [ iso ]
+
+tosca.artifacts.Deployment.Image.VM.QCOW2:
+  derived_from: tosca.artifacts.Deployment.Image
+  description: Virtual Machine (VM) image in QCOW v2 standard disk format
+  mime_type: application/octet-stream
+  file_ext: [ qcow2 ]
diff --git a/xos/tosca/definitions/xos.yaml b/xos/tosca/definitions/xos.yaml
new file mode 100644
index 0000000..2651739
--- /dev/null
+++ b/xos/tosca/definitions/xos.yaml
@@ -0,0 +1,276 @@
+# XXX for some reason, we can't use 'derived_from' to derive from a type that's
+# defined in an import. I think this is probably a bug in the Tosca
+# implementation. For now, we'll just concatenate the 1.0 definition yaml with
+# this file and use that for the definition.
+#
+# When the bug is fixed, go back to making this an import.
+
+#tosca_definitions_version: tosca_simple_yaml_1_0
+
+#node_types:
+
+tosca.nodes.XOS:
+    derived_from: tosca.nodes.Root
+    properties:
+        no-delete:
+            type: boolean
+            default: false
+            description: do not allow Tosca to delete this object
+        no-create:
+            type: boolean
+            default: false
+            description: do not allow Tosca to create this object
+
+tosca.nodes.Service:
+    derived_from: tosca.nodes.Root
+    capabilities:
+        scalable:
+            type: tosca.capabilities.Scalable
+        service:
+            type: tosca.capabilities.xos.Service
+    properties:
+        view_url:
+            type: string
+            required: false
+
+tosca.nodes.VcpeService:
+    derived_from: tosca.nodes.Service
+
+tosca.nodes.User:
+    derived_from: tosca.nodes.Root
+
+    capabilities:
+        user:
+            type: tosca.capabilities.xos.User
+
+    properties:
+        password:
+            type: string
+            required: true
+        firstname:
+            type: string
+            required: true
+        lastname:
+            type: string
+            required: true
+        phone:
+            type: string
+            required: false
+        user_url:
+            type: string
+            required: false
+        public_key:
+            type: string
+            required: false
+        is_active:
+            type: boolean
+            default: true
+        is_admin:
+            type: boolean
+            default: false
+        login_page:
+            type: string
+            required: false
+
+tosca.nodes.NetworkTemplate:
+    derived_from: tosca.nodes.Root
+
+    capabilities:
+        network_template:
+            type: tosca.capabilities.xos.NetworkTemplate
+
+    properties:
+        visibility:
+            type: string
+            default: private
+        translation:
+            type: string
+            default: none
+        shared_network_name:
+            type: string
+            required: false
+        shared_network_id:
+            type: string
+            required: false
+        topology_kind:
+            type: string
+            default: BigSwitch
+        controller_kind:
+            type: string
+            required: false
+
+tosca.nodes.XOSNetwork:
+    derived_from: tosca.nodes.Root
+
+    capabilities:
+        network:
+            type: tosca.capabilities.xos.Network
+
+    properties:
+        ports:
+            type: string
+            required: false
+        labels:
+            type: string
+            required: false
+        permit_all_slices:
+            type: boolean
+            default: false
+        permitted_slices:
+            type: string
+            required: false
+
+tosca.nodes.Deployment:
+    derived_from: tosca.nodes.Root
+    capabilities:
+        deployment:
+            type: tosca.capabilities.xos.Deployment
+
+tosca.nodes.Controller:
+    derived_from: tosca.nodes.Root
+    capabilities:
+        controller:
+            type: tosca.capabilities.xos.Controller
+    properties:
+        backend_type:
+            type: string
+            required: false
+        version:
+            type: string
+            required: false
+        auth_url:
+            type: string
+            required: false
+        admin_user:
+            type: string
+            required: false
+        admin_password:
+            type: string
+            required: false
+        admin_tenant:
+            type: string
+            required: false
+        domain:
+            type: string
+            required: false
+
+tosca.nodes.Site:
+    derived_from: tosca.nodes.Root
+    capabilities:
+        site:
+            type: tosca.capabilities.xos.Site
+    properties:
+         display_name:
+             type: string
+             required: false
+             description: name of the site
+         site_url:
+             type: string
+             required: false
+         enabled:
+             type: boolean
+             default: true
+         hosts_nodes:
+             type: boolean
+             default: true
+         hosts_users:
+             type: boolean
+             default: true
+         is_public:
+             type: boolean
+             default: true
+         # location, longitude, latitude
+
+tosca.nodes.Slice:
+    derived_from: tosca.nodes.Root
+    capability:
+        slice:
+            type: tosca.capabilities.xos.Slice
+
+tosca.relationships.MemberOfSlice:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabilities.xos.Slice ]
+
+tosca.relationships.MemberOfService:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabilities.xos.Service ]
+
+tosca.relationships.MemberOfSite:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabilities.xos.Site ]
+
+tosca.relationships.TenantOfService:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabilities.xos.Service ]
+
+tosca.relationships.ControllerDeployment:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabilities.xos.Deployment ]
+
+tosca.relationships SiteDeployment:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabilities.xos.Deployment ]
+
+tosca.relationships.UsesController:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabilities.xos.Controller ]
+
+tosca.relationships.ConnectsToNetwork:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabilities.xos.Network ]
+
+#    tosca.relationships.OwnsNetwork:
+#        derived_from: tosca.relationships.Root
+#        valid_target_types: [ tosca.capabilities.xos.Network ]
+
+tosca.relationships.UsesNetworkTemplate:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabilities.xos.NetworkTemplate ]
+
+tosca.relationships.AdminPrivilege:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabilities.xos.Slice, tosca.capabiltys.xos.Site ]
+
+tosca.relationships.AccessPrivilege:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabilities.xos.Slice, tosca.capabiltys.xos.Site ]
+
+tosca.relationships.PIPrivilege:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabiltys.xos.Site ]
+
+tosca.relationships.TechPrivilege:
+    derived_from: tosca.relationships.Root
+    valid_target_types: [ tosca.capabiltys.xos.Site ]
+
+tosca.capabilities.xos.Service:
+    derived_from: tosca.capabilities.Root
+    description: An XOS Service
+
+tosca.capabilities.xos.Deployment:
+    derived_from: tosca.capabilities.Root
+    description: An XOS Deployment
+
+tosca.capabilities.xos.Controller:
+    derived_from: tosca.capabilities.Root
+    description: An XOS Controller
+
+tosca.capabilities.xos.Site:
+    derived_from: tosca.capabilities.Root
+    description: An XOS Site
+
+tosca.capabilities.xos.Slice:
+    derived_from: tosca.capabilities.Root
+    description: An XOS Slice
+
+tosca.capabilities.xos.NetworkTemplate:
+    derived_from: tosca.capabilities.Root
+    description: An XOS network template
+
+tosca.capabilities.xos.Network:
+    derived_from: tosca.capabilities.Root
+    description: An XOS network
+
+tosca.capabilities.xos.User:
+    derived_from: tosca.capabilities.Root
+    description: An XOS user
diff --git a/xos/tosca/destroy.py b/xos/tosca/destroy.py
index fd86fdc..5743234 100644
--- a/xos/tosca/destroy.py
+++ b/xos/tosca/destroy.py
@@ -1,6 +1,9 @@
 import os
 import sys
 
+# XXX - deal with what I think is a bug in OpenStack's tosca engine
+os.system("cat definitions/TOSCA_definition_1_0.yaml definitions/xos.yaml >  /opt/tosca/translator/toscalib/elements/TOSCA_definition_1_0.yaml")
+
 # add the parent directory to sys.path
 import os,sys,inspect
 currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))
diff --git a/xos/tosca/run.py b/xos/tosca/run.py
index aa284e0..d82aa4d 100644
--- a/xos/tosca/run.py
+++ b/xos/tosca/run.py
@@ -1,6 +1,9 @@
 import os
 import sys
 
+# XXX - deal with what I think is a bug in OpenStack's tosca engine
+os.system("cat definitions/TOSCA_definition_1_0.yaml definitions/xos.yaml >  /opt/tosca/translator/toscalib/elements/TOSCA_definition_1_0.yaml")
+
 # add the parent directory to sys.path
 import os,sys,inspect
 currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))