Merge remote-tracking branch 'github/master'
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..f85f310
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,43 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules
+jspm_packages
+
+# Optional npm cache directory
+.npm
+
+# Optional REPL history
+.node_repl_history
+
+*~
+
+# ignore generated *.js files inside lib and dist
+lib/*
+dist/*
diff --git a/.npmignore b/.npmignore
new file mode 100644
index 0000000..a7ed084
--- /dev/null
+++ b/.npmignore
@@ -0,0 +1,3 @@
+.git*
+
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..8dada3e
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   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.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..cbbbe22
--- /dev/null
+++ b/README.md
@@ -0,0 +1,71 @@
+# YANG model-driven CORD
+
+This is a **work-in-progress** effort to create
+[YANG](http://tools.ietf.org/html/rfc6020) data models for the
+[CORD](http://opencord.org) project and deliver flexible service
+compositions.
+
+You may contact Larry Peterson <llp@onlab.us> and Peter Lee
+<peter@corenova.com> to learn more about this initiative and find out
+how you can help.
+
+## Installation
+
+```bash
+$ npm install yang-cord
+```
+
+## Getting Started
+
+Following the installation, you can **start** an instance of the YANG
+model-driven REST API web server. It utilizes
+[yang-express](http://github.com/corenova/yang-express) middleware
+framework built on [Express.js](http://expressjs.com) to provide
+dynamic YANG model-driven API routing capability.
+
+```bash
+$ npm start
+
+> yang-cord@1.0.8 start /home/plee/hack/yang-cord
+> node lib/api/server.js
+
+[yang-express] start of a new journey
+[openapi] enabling...
+[openapi] enabled ok
+[restjson] enabling...
+[restjson] enabled ok
+[websocket] enabling...
+[yang-express] registering a new link
+[yang-express] registered 'link:cord-core'
+[yang-express] registering a new link
+[yang-express] registered 'link:xos-core'
+[websocket] binding to server
+[websocket] enabled ok
+```
+
+_An option `--port` is provided to specify the port to listen on, it can be used with:_
+
+```
+npm start -- --port 3000
+```
+
+## Reference Guides
+
+- [API Guide](./src/README.md) - provides a walkthrough on *interacting with the REST API endpoints*
+- [Modeler's Guide](./schema/README.md) - provides information on *current YANG models for XOS and CORD* and what's coming up next
+- [Developer's Guide](./src/README.md) - provides technical detail on *controller logic and dynamic interfaces* and how to best leverage YANG model-driven developer tools for getting things done *fast*.
+
+## Tests
+
+To run the test suite, first install the dependencies, then run `npm
+test`.
+
+```
+$ npm install
+$ npm test
+```
+Mocha test suite is currently under development...
+
+## LICENSE
+  [Apache 2.0](LICENSE)
+
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..d72531f
--- /dev/null
+++ b/package.json
@@ -0,0 +1,61 @@
+{
+  "name": "yang-cord",
+  "version": "1.1.4",
+  "description": "YANG model-driven CORD",
+  "author": "Peter K. Lee <peter@corenova.com>",
+  "license": "Apache-2.0",
+  "homepage": "http://wiki.opencord.org/",
+  "repository": "corenova/yang-cord",
+  "keywords": [
+    "cord",
+    "opencord",
+    "onlab",
+    "xos",
+    "onos",
+    "subscriber",
+    "tenant",
+    "device",
+    "yangjs",
+    "express",
+    "service"
+  ],
+  "models": {
+    "ietf-yang-types": "yang-js",
+    "ietf-inet-types": "yang-js",
+    "corenova-node": "corenova",
+    "xos-core": "./schema/xos-core.yang",
+    "cord-core": "./lib/cord-core.js",
+    "cord-device": "./lib/cord-device.js",
+    "cord-subscriber": "./lib/cord-subscriber.js"
+  },
+  "dependencies": {
+    "minimist": "^1.2.0",
+    "node-uuid": "^1.4.7",
+    "superagent": "^2.0.0",
+    "yang-express": "^0.3.15",
+    "yang-js": "^0.15.25"
+  },
+  "optionalDependencies": {
+    "corenova": "^1.0.0"
+  },
+  "devDependencies": {
+    "coffee-script": ">=1.7.0",
+    "config": "^1.19.0",
+    "mocha": "~2.0.1",
+    "rimraf": "^2.5.2",
+    "should": "~3.1.3",
+    "webpack": "^1.13.1"
+  },
+  "main": "./lib/cord-core.js",
+  "scripts": {
+    "clean": "rimraf dist/* lib/*",
+    "prebuild": "npm run clean -s && mkdir -p dist",
+    "build:src": "coffee -o lib -c src",
+    "build:web": "webpack -p",
+    "build": "npm run build:src",
+    "prepublish": "npm run build",
+    "pretest": "npm run build",
+    "test": "mocha",
+    "start": "node lib/server.js"
+  }
+}
diff --git a/sample-data.json b/sample-data.json
new file mode 100644
index 0000000..b879e51
--- /dev/null
+++ b/sample-data.json
@@ -0,0 +1,10 @@
+{
+  "xos-core:api": {
+    "service": {},
+    "tenant":  {}
+  },
+  "cord-core:subscriber": [
+    { "id": 1, "service-specific-id": 1000 },
+    { "id": 2, "service-specific-id": 1001 }
+  ]
+}
diff --git a/schema/README.md b/schema/README.md
new file mode 100644
index 0000000..3e6ecd8
--- /dev/null
+++ b/schema/README.md
@@ -0,0 +1,176 @@
+# Modeler's Guide
+
+This is also a **work-in-progress** documentation capturing current
+models for XOS and CORD. It's currently *exploratory* and contains
+free-flowing commentary regarding observations from reviewing the
+originating reference code repository as well as any deviations and
+recommendations on expressing them as YANG models.
+
+The initial effort is centered around capturing the CORD Subscriber
+model and its dependent models.  We'll be reguarly updating this
+document as we capture additional models from XOS/CORD repository in
+the coming days.
+
+## XOS Data Models
+
+### xos-core 
+
+- YANG schema: [xos-core.yang](./xos-core.yang)
+- Source reference: [opencord/xos](http://github.com/opencord/xos)
+
+This YANG module is the **primary** module that will house all XOS
+related data models going forward.  The models for these came from
+`xos/core/models` directory in the XOS repository.  It will eventually
+house the `Service` class, the `Tenant` class, etc.  One notable
+convention here is the existence of the `/api/tenant` and
+`/api/service` configuration tree inside this module.  In a sense,
+we're considering this YANG module to be the **master** module that
+all other modules derive from and augments into this module.  You can
+see this *augment* behavior in the
+[cord-core.yang](./cord-core.yang) schema.
+
+As we capture more XOS data models, we will likely organize the
+additional models as separate YANG modules, such as `xos-service`,
+`xos-tenant`, `xos-slice`, etc. which will be *imported* by this
+module.
+
+For now, we've captured the `TenantRoot` and `Subscriber` classes.
+
+This module contains basic placeholder configuration data tree and
+passed into `yang-express`.
+
+## CORD Data Models
+
+### cord-core
+
+- YANG schema: [cord-core.yang](./cord-core.yang)
+- Source reference: [opencord](http://github.com/opencord)
+
+This YANG module is the **primary** module that will house all CORD
+related data models going forward.  It currently captures the
+`cord-subscriber` configuration tree and *imports* the subscriber
+schema from the `cord-subscriber` YANG module. From a pure data
+modeling perspective, the current originating reference implementation
+has yet to achieve a clean functional separation between XOS and
+CORD. This will be a key area of focus as we attempt to define a clear
+degree of abstraction between the XOS models and CORD models.
+
+This module contains subscriber-related configuration data tree and
+passed into `yang-express`.
+
+There are two main entry-points on the `subscriber` instances.  I've
+defined a `list subscriber` construct directly in the `module
+cord-core` which basically uses the `grouping subscriber-controller`
+data model.  This means that the `cord-core` YANG module itself will
+be the authorative holder of all subscriber instances.  Subsequently,
+I've augmented the `xos` module at the `/api/tenant` configuration
+tree to have a new `cord` tenant container along with a `node:link` to
+the subscriber list within the `cord-core` YANG module.  This
+convention makes it possible to access the `subscriber` instances by
+directly accessing the `cord-core` module, such as
+`/cord-core:subscriber` or via the `xos` module, such as
+`/xos-core:api/tenant/cord/subscriber`.
+
+### cord-device
+
+- YANG schema: [cord-device.yang](./cord-device.yang)
+- Source reference: [opencord/olt](http://github.com/opencord/olt)
+
+This YANG module is based on the `CordDevice` class found inside the
+`subscriber.py` (API) module implementation.  I think this particular
+model is rather under-developed and currently not placed in the right
+place (shouldn't be inside `subscriber.py` which should really just be
+the controller definitions).  This module has a potential to be
+leveraged more effectively if the goal is for this to become one the
+the core CORD models from which other devices inherit from (which I'm
+guessing it will be).
+
+We will need to review its association with the `cord-subscriber`
+model and better understand its role in relation with other *device*
+oriented data models.
+
+This module provides *export definitions* and does not contain any
+configuration data tree.
+
+### cord-subscriber
+
+- YANG schema: [cord-subscriber.yang](./schema/cord-subscriber.yang)
+- Source reference: [opencord/olt](http://github.com/opencord/olt)
+
+This module contains the heart of the initial modeling exercise.  It
+captures the CORD Subscriber data model (which extends XOS Subscriber
+model, which extends XOS TenantRoot model).  There are two primary
+models: `grouping subscriber` and `grouping subscriber-controller`.
+
+This module provides *export definitions* and does not contain any
+configuration data tree.
+
+#### grouping subscriber
+
+The 'subscriber' model extends the `xos:subscriber` (from the
+[xos-core.yang](./xos-core.yang)) and mirrors as closely as possible
+the `CordSubscriberRoot` class.  Some deviations were largely around
+the variable name convention where I've replaced all underscore with a
+dash (*upload_speed* is now *upload-speed*).  This is largely to
+comply with YANG convention where the schema is used to model XML
+element structure and underscores are not really used in XML based
+representations (not even sure if it is valid...).
+
+The other key deviation is in the organization of the various
+attributes.  Instead of having a simple flat list of properties, I've
+grouped them into related 'services' (pseudo-JSON below):
+
+```js
+services: {
+  cdn: {
+    enabled: true
+  },
+  firewall: {
+    enabled: true,
+    rules: []
+  },
+  url-filter: {
+    enabled: true,
+    level: 'PG',
+    rules: []
+  }
+  uverse: {
+    enabled: true
+  }
+}
+```
+
+Eventually, I think these four *hard-coded* services will be moved out
+of the `cord-subscriber` data model altogether.  I'm not sure what
+*on-boarded* services actually implement these features but it should
+be augmented by those individual service's YANG models into the
+cord-subscriber data model.
+
+#### grouping subscriber-controller
+
+I've internally debated creating this controller model because I
+thought that the necessary attributes were rather effectively captured
+in the prior `grouping subscriber` schema definition.  But the
+presence of the `related` object container in the controller (that
+shouldn't be in the underlying model) convinced me to model it
+according to the `CordSubscriberNew` class found inside
+`api/tenant/cord/subscriber.py`.  This `subscriber-controller` model
+extends the `subscriber` model (inheriting all its attributes) and
+introduces the additional containers for `features`, `identity`, and
+`related`.  Since the main function of the `subscriber-controller`
+model is to essentially layer a *view-like* overlay on top of the
+underlying cord-subscriber model, I've introduced a new *custom
+extension* construct called `node:link`.  This is to capture the fact
+that the various attributes being expressed are simply a reference
+link to the exact same data that is located at a different place
+within the same object.
+
+One note on the `related` object, it is currently a placeholder
+container and I expect it will remain that way as part of the model.
+The reason is, the attributes that are currently mapped inside all
+come from the `VOLT` service (which then has other attributes from
+`VSG` service, etc.).  When we get to the step of modeling the various
+`Service` entities, we'll capture the necessary *augment* behavior in
+those separate YANG modules (i.e. cord-service-volt.yang,
+cord-service-vsg.yang, etc.).
+
diff --git a/schema/cord-core.yang b/schema/cord-core.yang
new file mode 100644
index 0000000..18b9f47
--- /dev/null
+++ b/schema/cord-core.yang
@@ -0,0 +1,58 @@
+module cord-core {
+  
+  namespace "urn:onlab:cord";
+  prefix cord;
+  yang-version 1.1;
+
+  organization
+   "Open Networking Lab (CORD) / Corenova Technologies";
+
+  contact
+    "Larry Peterson <llp@onlab.us>
+     Peter K. Lee <peter@corenova.com>";
+
+  description
+   "This module contains a collection of core models for CORD.
+
+    Copyright (c) 2016 ON.LAB and the persons identified as authors of
+    the code.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, is permitted pursuant to, and subject to the license
+    terms of the Apache License, Version 2.0 which accompanies this
+    distribution, and is available at
+    (http://www.apache.org/licenses/LICENSE-2.0).";
+  
+  revision 2016-07-22 {
+    description "Initial revision.";
+  }
+
+  import xos-core        { prefix xos; }
+  import cord-subscriber { prefix csub; }
+  import corenova-node   { prefix node; }
+  
+  /*** primary configuration tree for this module ***/
+  
+  list subscriber {
+    uses csub:subscriber;
+    key "id";
+
+    description
+      "Authorative list of all subscriber instances";
+
+    leaf label {
+      config false;
+      type string {
+        pattern '^cordSubscriber-\w+$';
+      }
+    }
+    action delete;
+  }
+
+  // here we augment the /api/tenant API configuration tree in 'xos' module
+  augment "/xos:api/xos:tenant" {
+    container cord {
+      node:link subscriber { path "/cord:subscriber"; }
+    }
+  }
+}
diff --git a/schema/cord-device.yang b/schema/cord-device.yang
new file mode 100644
index 0000000..c0916ff
--- /dev/null
+++ b/schema/cord-device.yang
@@ -0,0 +1,48 @@
+module cord-device {
+  namespace "urn:onlab:cord:device";
+  prefix cord-dev;
+  yang-version 1.1;
+
+  organization
+   "Open Networking Lab (CORD) / Corenova Technologies";
+
+  contact
+    "Larry Peterson <llp@onlab.us>
+     Peter K. Lee <peter@corenova.com>";
+  
+  import ietf-yang-types { prefix yang; }
+  
+  revision 2016-07-14 {
+    description "Initial revision.";
+  }
+
+  typedef bandwidth {
+    type uint32 {
+      range 1000000..max; // should be at least 1 Mbps?  
+    }
+    units 'bps';
+  }
+  
+  grouping device {
+    leaf mac { type yang:mac-address; mandatory true; }
+    leaf identity { type string; }
+
+    leaf subscriber {
+      type instance-identifier;
+      config false;
+    }
+    
+    container features {
+      // how are the uplink/downlink speeds defined here related to 'subscriber'?
+      leaf uplink-speed {
+        type bandwidth;
+        default 1000000000;      
+      }
+      leaf downlink-speed {
+        type bandwidth;
+        default 1000000000;      
+      }
+      action update;
+    }
+  }
+}
diff --git a/schema/cord-service-volt.yang b/schema/cord-service-volt.yang
new file mode 100644
index 0000000..3073366
--- /dev/null
+++ b/schema/cord-service-volt.yang
@@ -0,0 +1,167 @@
+module cord-service-volt {
+  namespace "urn:onlab:cord:service:volt";
+  prefix volt;
+  yang-version 1.1;
+
+  import ietf-yang-types { prefix yang; }
+  import xos-core { prefix xos; }
+
+  organization
+   "Open Networking Lab (CORD) / Corenova Technologies";
+
+  contact
+    "Larry Peterson <llp@onlab.us>
+     Peter K. Lee <peter@corenova.com>";
+
+  revision 2016-09-09 {
+    description "Initial revision.";
+  }
+
+  identity volt-service { base xos:service; }
+
+  feature onos-app-olt {
+    description "System facility to configure VLAN tags on the OLT.";
+  }
+  feature onos-app-aaa {
+    description "System facility to broker authentication between CPE and Radius server.";
+  }
+
+  typedef bandwidth {
+    type xos:bandwidth;
+    default 1000000000; // VOLT bandwidth default is 1Gbps
+  }
+  typedef subscriber-flow {
+    type leafref {
+      path "/volt:service/volt:provider/volt:port/volt:id";
+    }
+  }
+
+  grouping devices-list {
+    grouping olt-device {
+      description
+        "This grouping describes an OLT device which contains ODN link attachments.";
+    
+      leaf name {
+        description "name of OLT device";
+        type string {
+          length 1..254;
+        }
+      }
+      leaf mac { type yang:mac-address; mandatory true; }
+
+      container uplink {
+        description "Uplink description of the OLT device.";
+        leaf network { type yang:uuid; }
+        leaf tag {
+          if-feature onos-app-olt;
+          type xos:vlan;
+          description
+            "Represents S-Tag for instructing OLT to associate a VLAN tag for
+             traffic originating from OLT device.";
+        }
+      }
+    
+      list link {
+        description
+          "Each link represents an ONU/ONT (Optical Network Termination) endpoint
+           connection.";
+
+        key serial;
+        unique tag;
+      
+        leaf mac    { type yang:mac-address; mandatory true; }
+        leaf serial { type string; mandatory true; }
+        leaf active { type boolean; default false; }
+        leaf tag {
+          if-feature onos-app-olt;
+          type xos:vlan;
+          description
+            "Represents C-Tag for instructing ONT to add/remove vlan tag for
+             traffic within OLT device.";
+        }
+      }
+    }
+    list device {
+      description
+        "Each entry represents an OLT device.";
+      key mac;
+      //unique 'uplink/tag';
+      uses olt-device;
+    }
+  }
+  grouping provider {
+    description
+      "This grouping represents a VOLT agent/provider which manages multiple
+       OLT devices. The VOLT agent provides aggregate abstraction of
+       the entire PON as a sigle switch to the controller. Each port
+       entry of the agent represents each ONU/ONT endpoint as a
+       separate openflow port.";
+
+    uses devices-list {
+      description
+        "Each entry represents an OLT device managed by the agent.";
+    }
+    list port {
+      description
+        "Each entry represents an ONU/ONT endpoint connected across OLT devices.";
+      key id;
+      leaf id {
+        description "OpenFlow Port ID";
+        type yang:uuid;
+        mandatory true;
+      }
+      leaf link {
+        type leafref {
+          path '../../device/link/serial';
+        }
+        mandatory true;
+      }
+    }
+    container radius {
+      if-feature onos-app-aaa;
+      // configuration for how to broker authentication requests
+    }
+  }
+  grouping subscriber {
+    description
+      "This grouping represents a VOLT service subscriber along with
+       references to ONU/ONT access endpoints used by the subscriber.";
+    
+    list tag {
+      description
+        "Each entry represents a unique combination of the OLT uplink VLAN
+         (outer tag) and the ONU/ONT link VLAN (inner tag) connecting
+         into the fabric for the subscriber.";
+      
+      key 'outer inner';
+      leaf outer {
+        type leafref {
+          path "/volt:service/volt:provider/volt:device/volt:uplink/volt:tag";
+        }
+      }
+      leaf inner {
+        type leafref {
+          path "/volt:service/volt:provider/volt:device/volt:link/volt:tag";
+        }
+      }
+    }
+    leaf-list flows {
+      description
+        "Each entry represents a unique openflow port ID that the subscriber
+         uses to connect into the fabric from the VOLT service.";
+      config false;
+      type subscriber-flow;
+    }
+  }
+
+  /*
+   * Configuration data
+   */
+  container service {
+    uses xos:service {
+      refine kind { default volt-service; }
+      augment "provider"   { uses volt:provider; }
+      augment "subscriber" { uses volt:subscriber; }
+    }
+  }
+}
diff --git a/schema/cord-service-vsg.yang b/schema/cord-service-vsg.yang
new file mode 100644
index 0000000..16615e8
--- /dev/null
+++ b/schema/cord-service-vsg.yang
@@ -0,0 +1,157 @@
+module cord-service-vsg {
+  namespace "urn:onlab:cord:service:volt";
+  prefix volt;
+  yang-version 1.1;
+
+  import ietf-yang-types { prefix yang; }
+  import xos-core { prefix xos; }
+  import cord-service-volt { prefix volt; }
+
+  organization
+   "Open Networking Lab (CORD) / Corenova Technologies";
+
+  contact
+    "Larry Peterson <llp@onlab.us>
+     Peter K. Lee <peter@corenova.com>";
+
+  revision 2016-09-09 {
+    description "Initial revision.";
+  }
+
+  identity vsg-service { base xos:service; }
+
+  typedef subscriber-flow {
+    type leafref {
+      path "/vsg:service/vsg:provider/vsg:port/vsg:id";
+    }
+  }
+
+  grouping provider {
+    description
+      "This grouping represents a VSG agent/provider which manages multiple
+       VSG gateways. The VSG agent provides agregate abstraction of
+       the entire NFaaS as a single switch to the controller. Each
+       port entry of the agent represents each VSG subscriber flow as
+       a separate openflow port.";
+
+    list gateway {
+      description
+        "Each entry represents a VSG instance managed by the agent.";
+
+      leaf id { type xos:unique-identifier; }
+      
+      container services {
+        description
+          "Contains various services provided by the gateway.";
+        container cdn {
+          if-feature cdn;
+        }
+        container firewall {
+          if-feature firewall;
+          leaf-list rules { type string; }
+        }
+        container url-filter {
+          if-feature url-filter;
+          leaf level {
+            type enumeration {
+              enum "PG";
+              // others...
+            }
+          }
+          leaf-list rules { type string; }
+        }
+        container uverse {
+          if-feature uverse;
+        }
+      }
+      list flow {
+        description
+          "Each flow represents a subscriber flow into the VSG instance.";
+        leaf id {
+          type yang:uuid;
+        }
+      }
+    }
+    list port {
+      description
+        "Each entry represents a VSG subscriber flow connected across VSG
+         gateways.";
+      key id;
+      leaf id {
+        description "OpenFlow Port ID";
+        type yang:uuid;
+        mandatory true;
+      }
+      leaf link {
+        type leafref {
+          path '../../gateway/flow/id';
+        }
+        mandatory true;
+      }
+    }
+  }
+  grouping subscriber {
+    description
+      "This grouping represents a VSG service subscriber along with
+       reference to fabric flows used by the subscriber.";
+
+    leaf status {
+      type enumeration {
+        enum "enabled" {
+          description "Enabled";
+          value 1;
+        }
+        enum "suspended" {
+          description "Suspended";
+        }
+        enum "delinquent" {
+          description "Delinquent";
+        }
+        enum "violation" {
+          description "Copyright Violation";
+        }
+      }
+      default enabled;
+    }
+    leaf demo { type boolean; default false; }
+    leaf uplink-speed   { type volt:bandwidth; }
+    leaf downlink-speed { type volt:bandwidth; }
+    
+    list tag {
+      description
+        "Each entry represents a unique openflow port ID that the subscriber
+         connects to the VSG service from the fabric.";
+      
+      key flow;
+      leaf flow {
+        type union {
+          type volt:subscriber-flow;
+          type vsg:subscriber-flow {
+            description "can be an output flow from the VSG service.";
+          }
+          type yang:uuid {
+            description "supports a generic openflow port ID";
+          }
+        }
+      }
+    }
+    leaf-list flows {
+      description
+        "Each entry represents a unique openflow port ID that the subscriber
+         uses to connect into the fabric from the VSG service.";
+      config false;
+      type subscriber-flow;
+    }
+  }
+  
+  /*
+   * Configuration data
+   */
+  container service {
+    uses xos:service {
+      refine kind { default vsg-service; }
+      augment "provider"   { uses vsg:provider; }
+      augment "subscriber" { uses vsg:subscriber; }
+    }
+  }
+}
diff --git a/schema/cord-subscriber.yang b/schema/cord-subscriber.yang
new file mode 100644
index 0000000..86fa0e8
--- /dev/null
+++ b/schema/cord-subscriber.yang
@@ -0,0 +1,148 @@
+module cord-subscriber {
+  namespace "urn:onlab:cord:subscriber";
+  prefix csub;
+  yang-version 1.1;
+
+  organization
+   "Open Networking Lab (CORD) / Corenova Technologies";
+
+  contact
+    "Larry Peterson <llp@onlab.us>
+     Peter K. Lee <peter@corenova.com>";
+  
+  description
+   "This module contains CORD Subscriber model representing its
+    relationship to features and services.
+
+    Copyright (c) 2016 ON.LAB and the persons identified as authors of
+    the code.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, is permitted pursuant to, and subject to the license
+    terms of the Apache License, Version 2.0 which accompanies this
+    distribution, and is available at
+    (http://www.apache.org/licenses/LICENSE-2.0).";
+  
+  revision 2016-07-14 {
+    description "Initial revision.";
+  }
+  
+  import xos-core        { prefix xos; }
+  import cord-device     { prefix dev; }
+  import ietf-yang-types { prefix yang; }
+  import corenova-node   { prefix node; }
+
+  identity cord-subscriber { base xos:subscriber; }
+
+  grouping subscriber {
+    uses xos:subscriber {
+      refine kind { default cord-subscriber; }
+    }
+    leaf status {
+      type enumeration {
+        enum "enabled" {
+          description "Enabled";
+          value 1;
+        }
+        enum "suspended" {
+          description "Suspended";
+        }
+        enum "delinquent" {
+          description "Delinquent";
+        }
+        enum "violation" {
+          description "Copyright Violation";
+        }
+      }
+      default enabled;
+    }
+    leaf demo { type boolean; default false; }
+    leaf uplink-speed {
+      type dev:bandwidth;
+      default 1000000000;      
+    }
+    leaf downlink-speed {
+      type dev:bandwidth;
+      default 1000000000;      
+    }
+
+    container services {
+      description
+        "Contains various services available to the subscriber";
+      
+      container cdn {
+        leaf enabled { type boolean; default false; }
+      }
+      container firewall {
+        leaf enabled { type boolean; default false; }
+        leaf-list rules {
+          // should qualify further
+          type string;
+        }
+      }
+      container url-filter {
+        leaf enabled { type boolean; default false; }
+        leaf level {
+          type enumeration {
+            enum "PG";
+            // other types of level...
+          }
+        }
+        leaf-list rules {
+          // should qualify further
+          type string;
+        }
+      }
+      container uverse {
+        leaf enabled { type boolean; default false; }
+      }
+    }
+
+    list device {
+      uses dev:device;
+      key "mac";
+
+      action create {
+        input { uses dev:device; }
+      }
+      action update {
+        input { uses dev:device; }
+      }
+      action delete;
+    }
+  }
+
+  grouping subscriber-controller {
+    uses subscriber;
+
+    node:view "features identity related";
+
+    container features {
+      node:link cdn            { path "../services/cdn/enabled"; }
+      node:link uplink-speed   { path "../uplink-speed"; }
+      node:link downlink-speed { path "../downlink-speed"; }
+      node:link uverse         { path "../services/uverse/enabled"; }
+      node:link status         { path "../status"; }
+      
+      action update {
+        description "when invoked, updates the features container (PUT)";
+      }
+    }
+    
+    container identity {
+      node:link account-num { path "../service-specific-id"; }
+      node:link name        { path "../name"; }
+      
+      action update {
+        description "when invoked, updates the identity container (PUT)";
+      }
+    }
+
+    container related {
+      config false;
+      description
+        "placeholder where other services can augment for info they want to
+         share (READ-ONLY)";
+    }
+  }
+}
diff --git a/schema/corenova-node.yang b/schema/corenova-node.yang
new file mode 100644
index 0000000..e0873e0
--- /dev/null
+++ b/schema/corenova-node.yang
@@ -0,0 +1,41 @@
+module corenova-node {
+  namespace "urn:corenova:node";
+  prefix node;
+
+  organization
+    "Corenova Technologies, Inc.";
+
+  contact
+    "Peter K. Lee <peter@corenova.com>";
+
+  description
+    "This module defines extensions to dynamically control schema node
+     display and access overlay controls";
+
+  feature corenova-node {
+    description
+      "this is to indicate the agent supports dynamic schema node
+       link and view constraints.";
+  }
+    
+  extension link {
+    description
+      "Links a new 'link-name' element to an alternate data node element in
+       the schema data tree referenced by the 'path' sub statement. It
+       can be used within 'container' or 'list' type data element to
+       hold one or more such 'links' as part of its configuration data
+       tree.  The new link element becomes a 'mirror' instance of the
+       target node found in the path expression.";
+    argument link-name {
+      yin-element true;
+    }
+  }
+
+  extension view {
+    description
+      "Informs the interface layers that only the data nodes referenced
+       within the value argument should be made visible to the
+       consumer.";
+    argument value;
+  }
+}
diff --git a/schema/experimental/xos-core-service.yang b/schema/experimental/xos-core-service.yang
new file mode 100644
index 0000000..3923221
--- /dev/null
+++ b/schema/experimental/xos-core-service.yang
@@ -0,0 +1,120 @@
+module xos-core-service {
+  namespace "urn:xos:core:service";
+  prefix xos-cs;
+
+  import complex-types { prefix ct; }
+
+  revision 2015-10-01 {
+    description "Initial revision.";
+  }
+
+  grouping service-attribute {
+    leaf name { type string { length 128; } }
+    leaf value { type string { length 1024; } }
+    leaf service {
+      type instance-identifier { ct:instance-type Service; require-instance true; }
+    }
+  }
+
+  grouping service-role {
+    leaf role {
+      type enumeration {
+        enum "admin";
+        //enum "Admin";
+      }
+    }
+  }
+
+  grouping common-model-attr {
+    leaf kind {
+      type string { length 30; }
+      default "generic";
+    }
+    leaf name { type string { length 255; } }
+  }
+
+  ct:complex-type ServiceElement {
+    ct:abstract true;
+    leaf enabled { type boolean; default true; }
+  }
+  
+  ct:complex-type Service {
+    ct:extends ServiceElement;
+    
+    leaf description {
+      type string { length 255; }
+      description "Description of Service";
+    }
+    leaf published { type boolean; default true; }
+
+    uses common-model-attr {
+      refine kind {
+        description "Kind of Service";
+      }
+      refine name {
+        description "Service Name";
+      }
+    }
+  }
+
+  ct:complex-type User {
+    ct:extends ServiceElement;
+    // TBD - should go to a separate xos-core-user module or such
+  }
+  
+  ct:complex-type ServicePrivilege {
+    key "user-service-role";
+    
+    leaf user {
+      type instance-identifier { ct:instance-type User; require-instance true; }
+    }
+    leaf service {
+      type instance-identifier { ct:instance-type Service; }
+    }
+    uses service-role;
+  }
+
+  ct:complex-type TenantRoot {
+    ct:extends ServiceElement;
+    
+    description
+      "A tenantRoot is one of the things that can sit at the root of a chain
+        of tenancy. This object represents a node.";
+    uses common-model-attr;
+  }
+
+  ct:complex-type ContainerImage {
+    // TBD
+  }
+  
+  ct:complex-type Tenancy {
+    ct:extends ServiceElement;
+    
+    description
+      "A Tenancy describes relationship between a subscriber and a provider";
+    
+    uses common-model-attr;
+
+    leaf provider { type instance-identifer { ct:instance-type Service; } }
+    leaf subscriber {
+      type instance-identifier {
+        ct:instance-type ServiceElement;
+      }
+    }
+
+    // adding stuff from TenantWithContainer here...
+    leaf creator { type instance-identifier { ct:instance-type User; } }
+    leaf image { type instance-identifier { ct:instance-type ContainerImage; } }
+  }
+
+  ct:complex-type Subscriber {
+    ct:extends TenantRoot;
+    refine kind { default "Subscriber"; }
+  }
+
+  ct:complex-type Provider {
+    ct:extends TenantRoot;
+    refine kind { default "Provider"; }
+  }
+  
+}
diff --git a/schema/xos-core.yang b/schema/xos-core.yang
new file mode 100644
index 0000000..d1ad954
--- /dev/null
+++ b/schema/xos-core.yang
@@ -0,0 +1,1350 @@
+module xos-core {
+  namespace "urn:onlab:xtype:core";
+  prefix xos;
+  yang-version 1.1;
+
+  import ietf-yang-types { prefix yang; }
+  import ietf-inet-types { prefix inet; }
+  import xos-types       { prefix xtype; }
+
+  organization
+   "Open Networking Lab (XOS) / Corenova Technologies";
+
+  contact
+    "Larry Peterson <llp@onlab.us>
+     Peter K. Lee <peter@corenova.com>";
+  
+  description
+   "This module contains a collection of core models for XOS.
+
+    Copyright (c) 2016 ON.LAB and the persons identified as authors of
+    the code.  All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, is permitted pursuant to, and subject to the license
+    terms of the Apache License, Version 2.0 which accompanies this
+    distribution, and is available at
+    (http://www.apache.org/licenses/LICENSE-2.0).";
+  
+  revision 2016-07-14 {
+    description "Initial revision.";
+  }
+  
+  feature synchronizer {
+    description
+      "Enables configuration synchronization to the distributed store.";
+  }
+  
+  identity kind;
+  identity generic { base kind; }
+  identity service { base kind; }
+
+  grouping attribute-pair {
+    leaf name  { type string { length 0..128; } }
+    leaf value { type string; }
+    // don't need pointer back to service
+  }
+
+  grouping sync-record {
+    description "Synchronizer-specific properties for model records";
+    
+    leaf created { type yang:date-and-time; }
+    leaf updated { type yang:date-and-time; }
+    leaf enacted { type yang:date-and-time; }
+    leaf policed { type yang:date-and-time; }
+        
+    leaf writable { type boolean; default true; }
+    leaf locked   { type boolean; default false; }
+    leaf deleted  { type boolean; default false; }
+      
+    leaf dirty {
+      config false;
+      type boolean;
+      default false;
+    }
+      
+    container sync {
+      anydata register {
+        description "scratchpad used by the Observer";
+      }
+      leaf progress {
+        type enumeration {
+          enum provisioning {
+            value 0;
+            description "Provisioning in progress";
+          }
+        }
+      }
+      leaf disabled { type boolean; default false; }
+      leaf enforced { type boolean; default true; }
+
+      list policy {
+        // TODO: how are policy defined/enforced?
+      }
+    }
+      
+    action diff {
+      when "../dirty == true";
+      description "retrieve diff of model state if dirty";
+    }
+    action save {
+      description "trigger save into data store via synchronizer";
+    }
+  }
+  
+  grouping base-common {
+    leaf id {
+      type xtype:unique-identifier;
+      mandatory true;
+    }
+    leaf name {
+      type string {
+        length 0..255;
+      }
+    }
+    list attribute {
+      uses attribute-pair;
+      key name;
+      status deprecated;
+      reference "XOS: service-specific-attribute";
+      description "backwards-compatible attribute association";
+    }
+    leaf service-specific-id {
+      type xtype:unique-identifier;
+      mandatory true;
+      status deprecated;
+    }
+    container record {
+      if-feature synchronizer;
+      uses sync-record;
+    }
+  }
+  grouping tenant-root {
+    uses base-common {
+      refine 'name' {
+        description "Specify name of the TenantRoot";
+      }
+    }
+    description
+      "A Tenant Root is one of the things that can sit at the root of a chain
+       of tenancy. This object represents a node.";
+
+    list subscribed-tenant {
+      config false;
+      // not exactly clear how this is populated
+    }
+  }
+  grouping subscriber {
+    uses tenant-root {
+      refine kind { default subscriber; }
+    }
+    // seems we should have interesting attributes specific to subscriber?
+  }
+  grouping provider {
+    uses tenant-root {
+      refine kind { default provider; }
+    }
+    // seems we should have interesting attributes specific to provider?
+  }
+  grouping service {
+    uses base-common {
+      refine 'name' {
+        description "Name of the Service";
+      }
+    }
+    leaf kind {
+      type identityref {
+        base kind;
+      }
+      default generic;
+    }
+    leaf description {
+      type string {
+        length 0..254;
+      }
+      description "Description of the Service";
+    }
+    leaf version {
+      type string { length 0..30; }
+      description "Version of Service Definition";
+    }
+    
+    leaf enabled   { type boolean; default true; }
+    leaf published { type boolean; default true; }
+
+    container links {
+      leaf view { type inet:uri; }
+      leaf icon { type inet:uri; }
+    }
+    
+    list keypair {
+      description "collection of public/private key pair(s)";
+      // should be a specific typedef for storing this content
+      leaf public  { type string { length 0..1024; } }
+      leaf private { type string { length 0..1024; } }
+    }
+    list provider {
+      description
+        "Each entry represents a provider of the service. Each unique service
+         should augment this block with service specific attributes.";
+      key id;
+      uses xtype:provider;
+    }
+    list subscriber {
+      description
+        "Each entry represents a subscriber of the service. Each unique service
+         should augment this block with service specific attributes.";
+      key id;
+      uses xtype:subscriber;
+      notification subscriber-added;
+      notification subscriber-deleted;
+    }
+    list slice {
+      uses xtype:slice;
+    }
+    
+    // TOOD: need to better understand relationship between Service and Slice
+    action scale {
+      description "Adjust scale for slice(s)";
+    }
+
+    // TODO: need to better understand relationship between Service and VTN
+  }
+
+  grouping tenancy {
+    uses base-common;
+
+    choice provider {
+      description "only one type of provider node is valid.";
+      case service { leaf provider-service { type instance-identifier; } }
+    }
+    
+    choice subscriber {
+      description "only one type of subscriber node is valid.";
+      case service { leaf subscriber-service { type instance-identifier; } }
+      case tenant  { leaf subscriber-tenant  { type instance-identifier; } }
+      case user    { leaf subscriber-user    { type instance-identifier; } }
+      case root    { leaf subscriber-root    { type instance-identifier; } }
+      case network { leaf subscriber-network { type instance-identifier; } }
+    }
+
+    leaf connect-method {
+      //when "../kind == 'static-tenant'";
+      
+      type enumeration {
+        enum public { description "Public"; }
+        enum private { description "Private"; }
+        enum private-unidirectional { description "Private Uni-directional"; }
+        enum na { description "Not Applicable"; }
+      }
+      default na;
+    }
+
+    // TODO: should be able to deal with TenantWithContainer here
+    
+  }
+
+  grouping slice {
+    description 
+      "A slice is a logically centralized container for network and compute resources"
+
+    uses base-common;
+
+    leaf enabled {
+       type boolean;
+       default true;
+    }
+
+    leaf omf-friendly {
+       type boolean;
+       default false;
+       status deprecated;
+    }
+
+    leaf slice-url {
+       description "A URL describing the purpose of this slice";
+       type xtype:url-field; 
+       // blank true;
+    }
+
+    leaf max-instances {
+       description "The maximum number of VMs that this slice is allowed to allocate";
+       type uint32;
+    } 
+
+    leaf service {
+       description "The service that runs in this slice";
+       type xtype:service;
+    }
+
+    leaf network {
+       description "The network that the slice uses to connect to other slices and to the Internet.";
+       type string;
+    }
+
+    leaf exposed-ports {
+       description "The ports to be exposed for other slices to connect to";
+       type string;
+    }
+
+    leaf service-class {
+      type xtype:service-class;
+      status deprecated;
+    }
+   
+    leaf creator {
+      type xtype:user;
+    }
+
+    leaf default-flavor {
+      type xtype:flavor;
+    }
+
+    leaf default-image {
+      type xtype:image;
+    }
+
+    leaf default-node {
+      type xtype:node;
+    } 
+
+    leaf mount-data-sets {
+      type string {
+        length 0..256; 
+      }
+      default "GenBank";
+    } 
+
+    leaf default_isolation {
+      type string {
+        length 0..30;
+      }
+      default "vm";
+    } 
+
+    leaf-list tags {
+      // below leafref is not valid since there is no /tag
+      type leafref {
+        path "/tag[id = current()/../id]/id";
+      }
+    }
+  }
+  
+  
+  grouping controller-images {
+    uses xos-base;
+
+    leaf image { 
+      type xtype:image; 
+    }
+
+    leaf controller { 
+      type xtype:controller; 
+    }
+
+    container synchronizer {
+        if-feature synchronizer {
+            leaf glance-image-id { 
+              type string;
+            }
+        }
+    }
+  }
+
+  grouping controller-site-privilege {
+    uses xos-base;
+
+    leaf controller { 
+      type xtype:controller; 
+    }
+
+    leaf site-privilege { 
+      type xtype:site-privilege; 
+    }
+    
+   container synchronizer {
+     if-feature synchronizer {
+
+       leaf role-id { 
+         type string;
+       }
+     }
+   }
+
+  grouping image {
+    uses xos-base;
+
+    
+    leaf kind { 
+      type string;
+    }
+    leaf disk-format { 
+      type string;
+    }
+    leaf container-format { 
+      type string;
+    }
+    leaf path { 
+      type string;
+    }
+    leaf tag { 
+      type string;
+    }
+  }
+
+  grouping controller-network {
+    uses xos-base;
+    leaf network { 
+      type xtype:network; 
+    }
+    leaf controller { 
+      type xtype:controller; 
+    }
+    
+    container synchronizer {
+        if-feature synchronizer {
+            leaf net-id { 
+              type string;
+            }
+            leaf router-id { 
+              type string;
+            }
+            leaf subnet-id { 
+              type string;
+            }
+        }
+
+    leaf subnet { 
+      type string;
+    }
+   
+  }
+
+  grouping site {
+    uses xos-base;
+    
+    leaf site-url { 
+      type xtype:url-field;
+    }
+    leaf enabled { 
+      type boolean;
+    }
+    leaf hosts-nodes { 
+      type boolean;
+    }
+    leaf hosts-users { 
+      type boolean;
+    }
+    leaf location { 
+      type xtype:geoposition-field;
+    }
+    leaf longitude { 
+      type decimal64;
+    }
+    leaf latitude { 
+      type decimal64;
+    }
+    leaf login-base { 
+      type string;
+    }
+    leaf is-public { 
+      type boolean;
+    }
+    leaf abbreviated-name { 
+      type string;
+    }
+  }
+
+  grouping slice-role {
+    uses xos-base;
+    leaf role { 
+      type string;
+    }
+  }
+
+  grouping site-deployment {
+    uses xos-base;
+    leaf site { 
+      type xtype:site; 
+    }
+    leaf deployment { 
+      type xtype:deployment; 
+    }
+    leaf controller { 
+      type xtype:controller; 
+    }
+    container synchronizer {
+        if-feature synchronizer {
+
+          leaf availability-zone { 
+            type string;
+          }
+        }
+    }
+  }
+
+  
+  grouping user-credential {
+    uses xos-base;
+    leaf user { 
+      type xtype:user; 
+    }
+    
+    leaf key-id { 
+      type string;
+    }
+
+    leaf enc-value { 
+      type xtype:encrypted-string;
+    }
+  }
+
+  grouping invoice {
+    uses xos-base;
+    leaf date { 
+      type xtype:datetime;
+    }
+    leaf account { 
+      type xtype:account; 
+    }
+  }
+
+  grouping slice-privilege {
+    uses xos-base;
+    leaf user { 
+      type xtype:user; 
+    }
+    leaf slice { 
+      type xtype:slice; 
+    }
+    leaf role { 
+      type xtype:role; 
+    }
+  }
+
+  grouping flavor {
+    uses xos-base;
+    
+    leaf description { 
+      type string;
+    }
+    leaf flavor { 
+      type string;
+    }
+    leaf order { 
+      type uint32;
+    }
+    leaf default { 
+      type boolean;
+    }
+  }
+
+  grouping port {
+    uses xos-base;
+    leaf network { 
+      type xtype:network; 
+    }
+    leaf instance { 
+      type xtype:instance; 
+    }
+    container synchronizer {
+        if-feature synchronizer {
+            leaf ip { 
+              type inet:ip-address;
+            }
+            leaf port-id { 
+              type string;
+            }
+            leaf mac { 
+              type string;
+            }
+        }
+    }
+    leaf xos-created { 
+      type boolean;
+    }
+  }
+
+  grouping service-role {
+    uses xos-base;
+    leaf role { 
+      type string;
+    }
+  }
+
+  grouping controller-site {
+    uses xos-base;
+    leaf site { 
+      type xtype:site; 
+    }
+
+    leaf controller { 
+      type xtype:controller; 
+    }
+
+    container synchronizer {
+        if-feature synchronizer {
+
+          leaf tenant-id { 
+            type string;
+          }
+        }
+    }
+  }
+
+  grouping controller-slice {
+    uses xos-base;
+    leaf controller { 
+      type xtype:controller; 
+    }
+    leaf slice { 
+      type xtype:slice; 
+    }
+    
+    container synchronizer {
+        if-feature synchronizer {
+          leaf tenant-id { 
+            type string;
+          }
+        }
+    }
+  }
+
+  grouping tenant-role {
+    uses xos-base;
+    leaf role { 
+      type string;
+    }
+  }
+
+  grouping network {
+    uses xos-base;
+    leaf template { 
+      type xtype:template; 
+    }
+
+    leaf subnet { 
+      type string;
+    }
+
+    leaf ports { 
+      type string;
+    }
+
+    leaf labels { 
+      type string;
+    }
+
+    leaf owner { 
+      type xtype:owner; 
+    }
+
+    leaf guaranteed-bandwidth { 
+      type uint32;
+    }
+
+    leaf permit-all-slices { 
+      type boolean;
+    }
+
+    leaf topology-parameters { 
+      type string;
+    }
+
+    leaf controller-url { 
+      type string;
+    }
+
+    leaf controller-parameters { 
+      type string;
+    }
+
+    container synchronizer {
+        if-feature synchronizer {
+            leaf network-id { 
+              type string;
+            }
+            leaf router-id { 
+              type string;
+            }
+            leaf subnet-id { 
+              type string;
+            }
+        }
+    }
+    leaf autoconnect { 
+      type boolean;
+    }
+  }
+
+  grouping controller-role {
+    uses xos-base;
+    leaf role { 
+      type string;
+    }
+  }
+
+  grouping diag {
+    uses xos-base;
+    
+  }
+
+  grouping service-class {
+    uses xos-base;
+    
+    leaf description { 
+      type string;
+    }
+    leaf commitment { 
+      type uint32;
+    }
+    leaf membership-fee { 
+      type uint32;
+    }
+    leaf membership-fee-months { 
+      type uint32;
+    }
+    leaf upgrade-requires-approval { 
+      type boolean;
+    }
+  }
+
+  grouping site-role {
+    uses xos-base;
+    leaf role { 
+      type string;
+    }
+  }
+
+  grouping instance {
+    uses xos-base;
+    container synchronizer {
+      if-feature synchronizer {
+        leaf instance-id { 
+          type string;
+        }
+
+        leaf instance-uuid { 
+          type string;
+        }
+        
+        leaf instance-name { 
+          type string;
+        }
+
+        leaf ip { 
+          type inet:ip-address;
+        }
+    }
+    leaf image { 
+      type xtype:image; 
+    }
+    leaf creator { 
+      type xtype:creator; 
+    }
+    leaf slice { 
+      type xtype:slice; 
+    }
+    leaf deployment { 
+      type xtype:deployment; 
+    }
+    leaf node { 
+      type xtype:node; 
+    }
+    leaf number-cores { 
+      type uint32;
+    }
+    leaf flavor { 
+      type xtype:flavor; 
+    }
+    leaf user-data { 
+      type string;
+    }
+    leaf isolation { 
+      type string;
+    }
+    leaf volumes { 
+      type string;
+    }
+    leaf parent { 
+      type xtype:parent; 
+    }
+  }
+
+  grouping charge {
+    uses xos-base;
+    leaf account { 
+      type xtype:account; 
+    }
+    leaf slice { 
+      type xtype:slice; 
+    }
+    leaf kind { 
+      type string;
+    }
+    leaf state { 
+      type string;
+    }
+    leaf date { 
+      type xtype:datetime;
+    }
+    leaf object { 
+      type xtype:object; 
+    }
+    leaf amount { 
+      type decimal64;
+    }
+    leaf core-hours { 
+      type decimal64;
+    }
+    leaf invoice { 
+      type xtype:invoice; 
+    }
+  }
+
+  grouping program {
+    uses xos-base;
+    leaf description { 
+      type string;
+    }
+
+    leaf kind { 
+      type string;
+    }
+
+    leaf command { 
+      type string;
+    }
+
+    leaf owner { 
+      type xtype:owner; 
+    }
+
+    leaf contents { 
+      type string;
+    }
+
+    leaf output { 
+      type string;
+    }
+
+    leaf messages { 
+      type string;
+    }
+
+    leaf status { 
+      type string;
+    }
+  }
+
+  grouping role {
+    uses xos-base;
+    leaf role-type { 
+      type string;
+    }
+    leaf role { 
+      type string;
+    }
+    leaf description { 
+      type string;
+    }
+    leaf content-type { 
+      type xtype:content-type; 
+    }
+  }
+
+  grouping usable-object {
+    uses xos-base;
+  }
+
+  grouping node-label {
+    uses xos-base;
+  }
+
+  grouping slice-credential {
+    uses xos-base;
+    leaf slice { 
+      type xtype:slice; 
+    }
+    
+    leaf key-id { 
+      type string;
+    }
+    leaf enc-value { 
+      type xtype:encrypted-string;
+    }
+  }
+
+  grouping node {
+    uses xos-base;
+    leaf site-deployment { 
+      type xtype:site-deployment; 
+    }
+    leaf site { 
+      type xtype:site; 
+    }
+  }
+
+  grouping address-pool {
+    uses xos-base;
+    leaf addresses { 
+      type string;
+    }
+    leaf gateway-ip { 
+      type string;
+    }
+    leaf gateway-mac { 
+      type string;
+    }
+    leaf cidr { 
+      type string;
+    }
+    leaf inuse { 
+      type string;
+    }
+    leaf service { 
+      type xtype:service; 
+    }
+  }
+
+  grouping dashboard-view {
+    uses xos-base;
+    leaf url { 
+      type string;
+    }
+    leaf enabled { 
+      type boolean;
+    }
+  }
+
+  grouping network-parameter {
+    uses xos-base;
+    leaf parameter { 
+      type xtype:parameter; 
+    }
+    leaf value { 
+      type string;
+    }
+    leaf content-type { 
+      type xtype:content-type; 
+    }
+    leaf object-id { 
+      type uint32;
+    }
+  }
+
+  grouping image-deployments {
+    uses xos-base;
+    leaf image { 
+      type xtype:image; 
+    }
+    leaf deployment { 
+      type xtype:deployment; 
+    }
+  }
+
+  grouping controller-user {
+    uses xos-base;
+    leaf user { 
+      type xtype:user; 
+    }
+
+    leaf controller { 
+      type xtype:controller; 
+    }
+    
+    container synchronizer {
+        if-feature synchronizer {
+            leaf kuser-id { 
+              type string;
+            }
+        }
+      }
+  }
+
+  grouping reserved-resource {
+    uses xos-base;
+    leaf instance { 
+      type xtype:instance; 
+    }
+    leaf resource { 
+      type xtype:resource; 
+    }
+    leaf quantity { 
+      type uint32;
+    }
+    leaf reservationSet { 
+      type xtype:reservationSet; 
+    }
+  }
+
+  grouping network-template {
+    uses xos-base;
+    leaf description { 
+      type string;
+    }
+    leaf guaranteed-bandwidth { 
+      type uint32;
+    }
+    leaf visibility { 
+      type string;
+    }
+    leaf translation { 
+      type string;
+    }
+    leaf access { 
+      type string;
+    }
+    leaf shared-network-name { 
+      type string;
+    }
+    leaf shared-network-id { 
+      type string;
+    }
+    leaf topology-kind { 
+      type string;
+    }
+    leaf controller-kind { 
+      type string;
+    }
+  }
+
+  grouping controller-dashboard-view {
+    uses xos-base;
+    leaf controller { 
+      type xtype:controller; 
+    }
+    leaf dashboardView { 
+      type xtype:dashboardView; 
+    }
+    leaf enabled { 
+      type boolean;
+    }
+    leaf url { 
+      type string;
+    }
+  }
+
+  grouping user-dashboard-view {
+    uses xos-base;
+    leaf user { 
+      type xtype:user; 
+    }
+    leaf dashboardView { 
+      type xtype:dashboardView; 
+    }
+    leaf order { 
+      type uint32;
+    }
+  }
+
+  grouping controller {
+    uses xos-base;
+    leaf backend-type { 
+      type string;
+    }
+    leaf version { 
+      type string;
+    }
+    leaf auth-url { 
+      type string;
+    }
+    leaf admin-user { 
+      type string;
+    }
+    leaf admin-password { 
+      type string;
+    }
+    leaf admin-tenant { 
+      type string;
+    }
+    leaf domain { 
+      type string;
+    }
+    leaf rabbit-host { 
+      type string;
+    }
+    leaf rabbit-user { 
+      type string;
+    }
+    leaf rabbit-password { 
+      type string;
+    }
+    leaf deployment { 
+      type xtype:deployment; 
+    }
+  }
+
+  grouping user {
+    uses xos-base;
+    leaf password { 
+      type string;
+    }
+    leaf last-login { 
+      type xtype:datetime;
+    }
+    leaf email { 
+      type EmailField;
+    }
+    leaf username { 
+      type string;
+    }
+    leaf firstname { 
+      type string;
+    }
+    leaf lastname { 
+      type string;
+    }
+    leaf phone { 
+      type string;
+    }
+    leaf user-url { 
+      type xtype:url-field;
+    }
+    leaf site { 
+      type xtype:site; 
+    }
+    leaf public-key { 
+      type string;
+    }
+    leaf is-active { 
+      type boolean;
+    }
+    leaf is-admin { 
+      type boolean;
+    }
+    leaf is-staff { 
+      type boolean;
+    }
+    leaf is-readonly { 
+      type boolean;
+    }
+    leaf is-registering { 
+      type boolean;
+    }
+    leaf is-appuser { 
+      type boolean;
+    }
+    leaf login-page { 
+      type string;
+    }
+    leaf timezone { 
+      type xtype:time-zone-field;
+    }
+  }
+
+  grouping deployment {
+    uses xos-base;
+    
+    leaf access-control { 
+      type string;
+    }
+  }
+
+  grouping reservation {
+    uses xos-base;
+    leaf start-time { 
+      type xtype:datetime;
+    }
+    leaf slice { 
+      type xtype:slice; 
+    }
+    leaf duration { 
+      type uint32;
+    }
+  }
+
+  grouping site-privilege {
+    uses xos-base;
+    leaf user { 
+      type xtype:user; 
+    }
+    leaf site { 
+      type xtype:site; 
+    }
+    leaf role { 
+      type xtype:role; 
+    }
+  }
+
+  grouping payment {
+    uses xos-base;
+    leaf account { 
+      type xtype:account; 
+    }
+    leaf amount { 
+      type decimal64;
+    }
+    leaf date { 
+      type xtype:datetime;
+    }
+  }
+  
+  grouping network-slice {
+    uses xos-base;
+    leaf network { 
+      type xtype:network; 
+    }
+
+    leaf slice { 
+      type xtype:slice; 
+    }
+  }
+
+  grouping account {
+    uses xos-base;
+    leaf site { 
+      type xtype:site; 
+    }
+  }
+
+  grouping controller-slice-privilege {
+    uses xos-base;
+    leaf controller { 
+      type xtype:controller; 
+    }
+
+    leaf slice-privilege { 
+      type xtype:slice-privilege; 
+    }
+    
+    container synchronizer {
+        if-feature synchronizer {
+            leaf role-id { 
+              type string;
+            }
+        }
+    }
+  }
+
+  grouping site-credential {
+    uses xos-base;
+    leaf site { 
+      type xtype:site; 
+    }
+    
+    leaf key-id { 
+      type string;
+    }
+
+    leaf enc-value { 
+      type xtype:encrypted-string;
+    }
+  }
+
+  grouping deployment-privilege {
+    uses xos-base;
+    leaf user { 
+      type xtype:user; 
+    }
+
+    leaf deployment { 
+      type xtype:deployment; 
+    }
+
+    leaf role { 
+      type xtype:role; 
+    }
+  }
+
+  grouping network-parameter-type {
+    uses xos-base;
+    leaf description { 
+      type string;
+    }
+  }
+  
+  grouping deployment-role {
+    uses xos-base;
+    leaf role { 
+      type string;
+    }
+  }
+
+  grouping project {
+    uses xos-base;
+  }
+  
+  grouping slice-tag {
+    uses xos-base;
+    leaf slice { 
+      type xtype:slice; 
+    }
+    
+    leaf value { 
+      type string;
+    }
+  }
+
+  grouping router {
+    uses xos-base;
+    leaf owner { 
+      type xtype:owner; 
+    }
+  }
+
+  grouping service-resource {
+    uses xos-base;
+    leaf service-class { 
+      type xtype:service-class; 
+    }
+    
+    leaf max-units-deployment { 
+      type uint32;
+    }
+
+    leaf max-units-node { 
+      type uint32;
+    }
+
+    leaf max-duration { 
+      type uint32;
+    }
+
+    leaf bucket-in-rate { 
+      type uint32;
+    }
+
+    leaf bucket-max-size { 
+      type uint32;
+    }
+
+    leaf cost { 
+      type uint32;
+    }
+
+    leaf calendar-reservable { 
+      type boolean;
+    }
+  }
+
+  grouping service-privilege {
+    uses xos-base;
+    leaf user { 
+      type xtype:user; 
+    }
+    leaf service { 
+      type xtype:service; 
+    }
+    leaf role { 
+      type xtype:role; 
+    }
+  }
+
+  /*** main configuration tree for XOS ***/
+
+  container api {
+    description
+      "The primary configuration interaction endpoint";
+    
+    container service {
+      description
+        "placeholder endpoint for services to augment";
+    }
+    container tenant {
+      description
+        "placeholder endpoint for tenants to augment";
+    }
+  }
+  
+}
diff --git a/schema/xos-types.yang b/schema/xos-types.yang
new file mode 100644
index 0000000..da58981
--- /dev/null
+++ b/schema/xos-types.yang
@@ -0,0 +1,240 @@
+module xos-types {
+  namespace "urn:onlab:xos:types";
+  prefix xtype;
+  yang-version 1.1;
+
+  organization
+   "Open Networking Lab (CORD) / Corenova Technologies";
+
+  contact
+    "Larry Peterson <llp@onlab.us>
+     Peter K. Lee <peter@corenova.com>";
+  
+  import ietf-yang-types { prefix yang; }
+  
+  revision 2016-09-12 {
+    description "Initial revision.";
+  }
+
+  /*
+   * Typedefs
+   */
+  typedef unique-identifier {
+    description "defines valid formats for external reference id";
+    type union {
+      type uint32 { range 1..max; }
+      type yang:uuid;
+      type inet:uri;
+    }
+  }
+  typedef bandwidth {
+    type uint32 {
+      range 1000000..max; // should be at least 1 Mbps?  
+    }
+    units 'bps';
+  }
+  typedef vlan {
+    type uint16 { range 0..4095; }
+  }
+  typedef image {
+    type unique-identifier;
+  }
+  typedef controller-network {
+    type unique-identifier;
+  }
+  typedef site {
+    type unique-identifier;
+  }
+  typedef tenant-root-role {
+    type unique-identifier;
+  }
+  typedef slice-role {
+    type unique-identifier;
+  }
+  typedef site-deployment {
+    type unique-identifier;
+  }
+  typedef tenant-privilege {
+    type unique-identifier;
+  }
+  typedef tag {
+    type unique-identifier;
+  }
+  typedef user-credential {
+    type unique-identifier;
+  }
+  typedef invoice {
+    type unique-identifier;
+  }
+  typedef slice-privilege {
+    type unique-identifier;
+  }
+  typedef flavor {
+    type unique-identifier;
+  }
+  typedef port {
+    type unique-identifier;
+  }
+  typedef service-role {
+    type unique-identifier;
+  }
+  typedef controller-site {
+    type unique-identifier;
+  }
+  typedef controller-slice {
+    type unique-identifier;
+  }
+  typedef tenant-role {
+    type unique-identifier;
+  }
+  typedef slice {
+    type unique-identifier;
+  }
+  typedef network {
+    type unique-identifier;
+  }
+  typedef controller-role {
+    type unique-identifier;
+  }
+  typedef diag {
+    type unique-identifier;
+  }
+  typedef service-class {
+    type unique-identifier;
+  }
+  typedef tenant-attribute {
+    type unique-identifier;
+  }
+  typedef site-role {
+    type unique-identifier;
+  }
+  typedef subscriber {
+    type unique-identifier;
+  }
+  typedef instance {
+    type unique-identifier;
+  }
+  typedef charge {
+    type unique-identifier;
+  }
+  typedef program {
+    type unique-identifier;
+  }
+  typedef role {
+    type unique-identifier;
+  }
+  typedef usable-object {
+    type unique-identifier;
+  }
+  typedef node-label {
+    type unique-identifier;
+  }
+  typedef slice-credential {
+    type unique-identifier;
+  }
+  typedef node {
+    type unique-identifier;
+  }
+  typedef address-pool {
+    type unique-identifier;
+  }
+  typedef dashboard-view {
+    type unique-identifier;
+  }
+  typedef network-parameter {
+    type unique-identifier;
+  }
+  typedef image-deployments {
+    type unique-identifier;
+  }
+  typedef controller-user {
+    type unique-identifier;
+  }
+  typedef reserved-resource {
+    type unique-identifier;
+  }
+  typedef network-template {
+    type unique-identifier;
+  }
+  typedef controller-dashboard-view {
+    type unique-identifier;
+  }
+  typedef user-dashboard-view {
+    type unique-identifier;
+  }
+  typedef controller {
+    type unique-identifier;
+  }
+  typedef user {
+    type unique-identifier;
+  }
+  typedef deployment {
+    type unique-identifier;
+  }
+  typedef reservation {
+    type unique-identifier;
+  }
+  typedef site-privilege {
+    type unique-identifier;
+  }
+  typedef payment {
+    type unique-identifier;
+  }
+  typedef tenant {
+    type unique-identifier;
+  }
+  typedef network-slice {
+    type unique-identifier;
+  }
+  typedef account {
+    type unique-identifier;
+  }
+  typedef tenant-root {
+    type unique-identifier;
+  }
+  typedef service {
+    type unique-identifier;
+  }
+  typedef controller-slice-privilege {
+    type unique-identifier;
+  }
+  typedef site-credential {
+    type unique-identifier;
+  }
+  typedef deployment-privilege {
+    type unique-identifier;
+  }
+  typedef network-parameter-type {
+    type unique-identifier;
+  }
+  typedef provider {
+    type unique-identifier;
+  }
+  typedef tenant-with-container {
+    type unique-identifier;
+  }
+  typedef deployment-role {
+    type unique-identifier;
+  }
+  typedef project {
+    type unique-identifier;
+  }
+  typedef tenant-root-privilege {
+    type unique-identifier;
+  }
+  typedef slice-tag {
+    type unique-identifier;
+  }
+  typedef coarse-tenant {
+    type unique-identifier;
+  }
+  typedef router {
+    type unique-identifier;
+  }
+  typedef service-resource {
+    type unique-identifier;
+  }
+  typedef service-privilege {
+    type unique-identifier;
+  }
+}
diff --git a/src/README.md b/src/README.md
new file mode 100644
index 0000000..3858028
--- /dev/null
+++ b/src/README.md
@@ -0,0 +1,443 @@
+# API Guide
+
+This document provides a comprehensive overview of the REST API
+interactions enabled via the
+[yang-express](http://github.com/corenova/yang-express) middleware
+framework built on [Express.js](http://expressjs.com).
+
+While much care has been taken to auto-generate the API endpoint
+routing to conform as closely as possible to
+[RESTCONF](https://datatracker.ietf.org/doc/draft-ietf-netconf-restconf),
+there are many key deviations and currently no plans to adapt the
+default REST API generator to be RESTCONF compatible.
+
+Instead, the REST API generated by the YANG data models are much more
+closely aligned to conventional REST APIs developed for use in the **web
+application development** community.  Also, there's currently no support
+for XML but instead follows the
+[YANG-JSON](https://datatracker.ietf.org/doc/draft-ietf-netmod-yang-json)
+specifications for representing configuration data in JSON.
+
+Below is the primary snippet from [server.coffee](./server.coffee)
+demonstrating how to use
+[yang-express](http://github.com/corenova/yang-express) middleware
+framework to fire up a web server instance capable of serving up the
+YANG model-driven CORD reference implementation.
+
+```coffeescript
+yang = require('yang-js')
+app = require('yang-express') ->
+  @set 'pkginfo', require('../../package.json')
+  @set 'initial state', require('../../sample-data.json')
+  @enable 'openapi', 'restjson', 'websocket'
+  
+  cord = @link yang.require('cord-core')
+  xos  = @link yang.require('xos-core')
+  
+  cord.on 'update', (prop) ->
+    console.log "[#{prop.path}] got updated, should consider persisting the change somewhere"
+```
+
+Yep, it's really that simple. 
+
+## CORD API Reference
+
+The following section presents various CRUD operations that are
+*runtime generated* from the `cord-core` YANG module. These operations
+are essentially interpreted and served **during runtime** depending on
+the YANG runtime model along with the configuration data state at any given
+point in time. Basically, it performs *adaptive* API routing and
+rendering.
+
+### Open-API Specification (Swagger 2.0)
+
+Initial partial-support for dynamic **openapi** specification
+generation has been introduced with the latest
+[yang-express](http://github.com/corenova/yang-express) middleware
+framework. It can send back JSON or YAML based specification output
+depending on the requesting client's `Accept` header. It defaults to
+JSON output.
+
+You can give it a try by issuing one of the following:
+```bash
+$ curl localhost:5050/swagger.spec
+$ curl localhost:5050/swagger.spec -H 'accept: text/yaml'
+```
+
+We'll plan to fully support the **openapi** specification along the way.
+
+### View Subscribers
+
+Valid URIs:
+
+- GET /cord-core:subscriber
+- GET /cord:subscriber
+- GET /subscriber
+
+Request:
+```bash
+$ curl localhost:5050/cord:subscriber
+```
+Response:
+```json
+{
+  "cord-core:subscriber": [
+    {
+      "id": 1,
+      "service-specific-id": 1000,
+      "humanReadableName": "cordSubscriber-1",
+      "status": "enabled",
+      "demo": false,
+      "uplink-speed": 1000000000,
+      "downlink-speed": 1000000000,
+      "kind": "cord-subscriber",
+      "related": {}
+    },
+    {
+      "id": 2,
+      "service-specific-id": 1001,
+      "humanReadableName": "cordSubscriber-2",
+      "status": "enabled",
+      "demo": false,
+      "uplink-speed": 1000000000,
+      "downlink-speed": 1000000000,
+      "kind": "cord-subscriber",
+      "related": {}
+    }
+  ]
+}
+```
+
+### View Details for a Subscriber
+
+Valid URIs:
+
+- GET /cord-core:subscriber/:id
+- GET /cord:subscriber/:id
+- GET /subscriber/:id
+
+Request:
+```bash
+$ curl localhost:5050/cord:subscriber/1
+```
+Response:
+```json
+{
+  "cord-core:subscriber": {
+    "id": 1,
+    "service-specific-id": 1000,
+    "humanReadableName": "cordSubscriber-1",
+    "status": "enabled",
+    "demo": false,
+    "uplink-speed": 1000000000,
+    "downlink-speed": 1000000000,
+    "kind": "cord-subscriber",
+    "related": {}
+  }
+}
+```
+
+### Update a Subscriber
+
+Valid URIs:
+
+- PUT /cord-core:subscriber/:id
+- PUT /cord:subscriber/:id
+- PUT /subscriber/:id
+
+Request:
+```bash
+$ curl -X PUT localhost:5050/cord:subscriber/1 -H 'content-type: application/json' -d '{ "id": 10, "status": "suspended", "services": { "cdn": { "enabled": true } } }'
+```
+Response:
+```json
+{
+  "cord-core:subscriber": {
+    "id": 10,
+    "service-specific-id": 1000,
+    "humanReadableName": "cordSubscriber-10",
+    "status": "suspended",
+    "demo": false,
+    "uplink-speed": 1000000000,
+    "downlink-speed": 1000000000,
+    "kind": "cord-subscriber",
+    "related": {},
+    "services": {
+      "cdn": {
+        "enabled": true
+      }
+    }
+  }
+}
+```
+
+This operation highlights an interesting scenario related to
+*invisible* YANG schema properties. Any configuration tree segment
+that does not contain any data behave as *shadow* properties, which
+basically means they spring to life once valid data gets placed into
+it but stays *invisible* otherwise.
+
+### Delete a Subscriber
+
+Valid URIs:
+
+- DELETE /cord-core:subscriber/:id
+- DELETE /cord:subscriber/:id
+- DELETE /subscriber/:id
+
+Request:
+```bash
+$ curl -X DELETE localhost:5050/cord:subscriber/2
+```
+Response:
+```
+HTTP 204
+```
+
+### Create a new Subscriber
+
+Valid URIs:
+
+- POST /cord-core:subscriber
+- POST /cord:subscriber
+- POST /subscriber
+
+Request:
+```bash
+$ curl -X POST localhost:5050/cord:subscriber -H 'content-type: application/json' -d '{ "id": 12, "service-specific-id": 2020, "demo": true }'
+```
+Response:
+```json
+{
+  "cord-core:subscriber": [
+    {
+      "id": 12,
+      "service-specific-id": 2020,
+      "demo": true,
+      "humanReadableName": "cordSubscriber-12",
+      "status": "enabled",
+      "uplink-speed": 1000000000,
+      "downlink-speed": 1000000000,
+      "kind": "cord-subscriber",
+      "related": {}
+    }
+  ]
+}
+```
+The POST operation is only available on YANG `list` schema elements as
+well as `rpc` and `action` elements. This operation also accepts
+**bulk create** request data by supplying a JSON array.
+
+### Describe the Subscriber Model
+
+This operation provides discovery of a given data model's
+characteristics as well as other data node elements available inside
+the data model. It can be used by REST API consumers to auto-discover
+additional paths and metadata associated with the target entity.  It's
+also useful for *dynamically generating API documentation* for a given
+data model.
+
+Valid URIs:
+
+- OPTIONS /cord-core:subscriber
+- OPTIONS /cord:subscriber
+- OPTIONS /subscriber
+
+Request:
+```bash
+$ curl -X OPTIONS localhost:5050/cord:subscriber
+```
+Response:
+```json
+{
+  "name": "cord-core:subscriber",
+  "kind": "list",
+  "path": "/cord-core:subscriber",
+  "exists": true,
+  "key": "id",
+  "description": "Authorative list of all subscriber instances",
+  "data": {
+    "humanReadableName": {
+      "kind": "leaf",
+      "config": false,
+      "type": {
+        "string": {
+          "pattern": "/^cordSubscriber-\\w+$/"
+        }
+      }
+    },
+    "status": {
+      "kind": "leaf",
+      "type": {
+        "enumeration": {
+          "enum": {
+            "enabled": {
+              "description": "Enabled",
+              "value": "1"
+            },
+            "suspended": {
+              "description": "Suspended",
+              "value": "2"
+            },
+            "delinquent": {
+              "description": "Delinquent",
+              "value": "3"
+            },
+            "violation": {
+              "description": "Copyright Violation",
+              "value": "4"
+            }
+          }
+        }
+      },
+      "default": "enabled"
+    },
+    "demo": {
+      "kind": "leaf",
+      "type": "boolean",
+      "default": "false"
+    },
+    "uplink-speed": {
+      "kind": "leaf",
+      "type": {
+        "dev:bandwidth": {
+          "range": "1000000..max"
+        }
+      },
+      "default": "1000000000",
+      "units": "bps"
+    },
+    "downlink-speed": {
+      "kind": "leaf",
+      "type": {
+        "dev:bandwidth": {
+          "range": "1000000..max"
+        }
+      },
+      "default": "1000000000",
+      "units": "bps"
+    },
+    "id": {
+      "kind": "leaf",
+      "type": {
+        "unique-identifier": {
+          "type": {
+            "uint32": {
+              "range": "1..max"
+            },
+            "yang:uuid": {
+              "pattern": "/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/"
+            }
+          }
+        }
+      },
+      "mandatory": true
+    },
+    "kind": {
+      "kind": "leaf",
+      "type": {
+        "identityref": {
+          "base": "kind"
+        }
+      },
+      "default": "generic"
+    },
+    "name": {
+      "kind": "leaf",
+      "type": {
+        "string": {
+          "length": "0..255"
+        }
+      },
+      "description": "Specify name of the TenantRoot"
+    },
+    "service-specific-attribute": {
+      "kind": "leaf",
+      "type": "string"
+    },
+    "service-specific-id": {
+      "kind": "leaf",
+      "type": {
+        "unique-identifier": {
+          "type": {
+            "uint32": {
+              "range": "1..max"
+            },
+            "yang:uuid": {
+              "pattern": "/[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}/"
+            }
+          }
+        }
+      },
+      "mandatory": true
+    },
+    "delete": {
+      "kind": "action"
+    },
+    "services": {
+      "kind": "container",
+      "description": "Contains various services available to the subscriber"
+    },
+    "device": {
+      "kind": "list",
+      "key": "mac"
+    },
+    "subscribed-tenants": {
+      "kind": "list",
+      "config": false
+    }
+  }
+}
+```
+
+### Additional Endpoints
+
+There are a number of additional operational endpoints dynamically
+rendered for the YANG data model. Since YANG is a **hierarchical**
+data modeling language, you can have deeply nested structures of
+various `containers` and `lists`. The appropriate CRUD operations can
+take effect as deep into the endpoint entity hierarchy according to
+the YANG schema.
+
+Here's a sample list of various URIs for the Subscriber model:
+
+Methods        | Endpoint URI
+---            | ---
+GET/POST       | /cord:subscriber
+GET/PUT/DELETE | /cord:subscriber/:id
+GET/PUT        | /cord:subscriber/:id/services/cdn
+GET/POST       | /cord:subscriber/:id/device
+GET/PUT/DELETE | /cord:subscriber/:id/device/:mac
+GET/PUT        | /cord:subscriber/:id/device/:mac/features
+
+### Validations
+
+Whenever POST/PUT requests are transacted, the incoming data is YANG
+schema validated to ensure fitness of the data before it gets applied
+into the runtime configuration data state.
+
+For example, if you tried to POST /cord:subscriber without the
+`mandatory` *id* and *service-specific-id* properties, it will
+generate an error and reject the request.
+
+Also, if you tried to PUT using data values that do not conform to the
+underlying YANG schema for that data element, it will generate an
+error and reject the requst.
+
+Invalid Request:
+```bash
+$ curl -X PUT localhost:5050/cord:subscriber/10 -H 'content-type: application/json' -d '{ "status": false }'
+```
+Error Response:
+```json
+{
+  "error": {
+    "message": "[enumeration] type violation for 'false' on enabled,suspended,delinquent,violation"
+  }
+}
+```
+
+For additional information on comprehensive validation enforcement
+support, please refer to [yang-js](http://github.com/corenova/yang-js)
+YANG compliance status report.
+
diff --git a/src/cord-core.coffee b/src/cord-core.coffee
new file mode 100644
index 0000000..abbff2f
--- /dev/null
+++ b/src/cord-core.coffee
@@ -0,0 +1,17 @@
+#
+# Author: Peter K. Lee (peter@corenova.com)
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+
+require('yang-js').register()
+
+module.exports = require('../schema/cord-core.yang').bind {
+
+  '/cord:subscriber/label': -> "cordSubscriber-#{@get '../id'}"
+
+  '/cord:subscriber/delete': (input, resolve, reject) -> reject "not yet implemented"
+}
diff --git a/src/cord-device.coffee b/src/cord-device.coffee
new file mode 100644
index 0000000..ce6c892
--- /dev/null
+++ b/src/cord-device.coffee
@@ -0,0 +1,16 @@
+#
+# Author: Peter K. Lee (peter@corenova.com)
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+
+require('yang-js').register()
+
+module.exports = require('../schema/cord-device.yang').bind {
+
+  '/{device}/features/update': (input, resolve, reject) -> reject "not yet implemented"
+  
+}
diff --git a/src/cord-subscriber.coffee b/src/cord-subscriber.coffee
new file mode 100644
index 0000000..7563aa7
--- /dev/null
+++ b/src/cord-subscriber.coffee
@@ -0,0 +1,32 @@
+#
+# Author: Peter K. Lee (peter@corenova.com)
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+
+require('yang-js').register()
+
+module.exports = require('../schema/cord-subscriber.yang').bind {
+
+  '/{subscriber}':
+    # auto-computed properties
+    'device/subscriber': -> @get '../..' 
+
+    # action bindings
+    'device/create': (input, resolve, reject) -> reject "TBD"
+    'device/update': (input, resolve, reject) -> reject "TBD"
+    'device/delete': (input, resolve, reject) -> reject "TBD"
+
+  '/{subscriber-controller}':
+    # auto-computed properties
+    'related': -> new Error "will return related objects once implemented"
+
+    # action bindings
+    'features/update': (input, resolve, reject) -> reject "TBD"
+    'identity/update': (input, resolve, reject) -> reject "TBD"
+    
+}    
+
diff --git a/src/server.coffee b/src/server.coffee
new file mode 100644
index 0000000..37f7345
--- /dev/null
+++ b/src/server.coffee
@@ -0,0 +1,32 @@
+#
+# Author: Peter K. Lee (peter@corenova.com)
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+
+Yang = require('yang-js')
+
+app = require('yang-express') ->
+  @enable 'yangapi'
+  @enable 'openapi', require('../package.json')
+  @enable 'restjson'
+  @enable 'websocket'
+
+  @open 'cord', ->
+    @import Yang.require('cord-core')
+    @import Yang.require('xos-core')
+
+    @connect require('../sample-data.json')
+    @on 'update', (prop) ->
+      console.log "[#{prop.path}] got updated, should consider persisting the change somewhere"
+
+module.exports = app
+
+# only start if directly invoked
+if require.main is module
+  argv = require('minimist')(process.argv.slice(2))
+  argv.port ?= 5050
+  app.listen argv.port
diff --git a/test/mocha.opts b/test/mocha.opts
new file mode 100644
index 0000000..38f602d
--- /dev/null
+++ b/test/mocha.opts
@@ -0,0 +1,3 @@
+--require should
+--compilers coffee:coffee-script/register
+--sort
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 0000000..92b0c18
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,5 @@
+var path = require('path');
+
+module.exports = {
+    entry: "./lib/client/entry.js"
+};