restore symlink
diff --git a/.gitignore b/.gitignore
index 451dd79..61b07cd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,9 +3,13 @@
 *.swp
 profile
 *.moved-aside
+.idea
+xos.iml
 xos/configurations/frontend/Dockerfile
 xos/core/xoslib/karma-*
 xos/core/xoslib/docs
 xos/core/xoslib/coverage
 node_modules
 xos/xos_configuration/*
+.idea/*
+xos.iml
diff --git a/README.md b/README.md
index 7a72658..ab36a2c 100644
--- a/README.md
+++ b/README.md
@@ -7,7 +7,10 @@
 Additional design notes, presentations, and other collateral are 
 also available at http://xosproject.org and http://cord.onosproject.org.
 
-The quickest way to get started is to look at the collection of
+One quick way to get started is to build and run the containers in
+*containers* (see the README in that directory for more information).
+
+Another quick way to get started is to look at the collection of
 canned configurations in *xos/configurations*. The *cord* 
 configuration in that directory corresponds to our current 
 CORD development environment, and the README you'll find there
diff --git a/containers/README.md b/containers/README.md
index fb53887..46f970e 100644
--- a/containers/README.md
+++ b/containers/README.md
@@ -17,7 +17,7 @@
 To build and run the database container:
 
 ```
-$ cd postgres; make build && make run
+$ cd postgresql; make build && make run
 ```
 
 #### XOS Container
@@ -29,7 +29,7 @@
 ```
 
 You should now be able to access the login page by visiting
-`http://localhost:80` and log in using the default `paadmin@vicci.org` account
+`http://localhost:8000` and log in using the default `padmin@vicci.org` account
 with password `letmein`. It may be helpful to bootstrap xos with some sample
 data; deployment, controllers, sites, slices, etc. You can get started by
 loading tosca configuration for the opencloud demo dataset:
diff --git a/containers/synchronizer/conf/synchronizer.conf b/containers/synchronizer/conf/synchronizer.conf
index cda6716..2131a25 100644
--- a/containers/synchronizer/conf/synchronizer.conf
+++ b/containers/synchronizer/conf/synchronizer.conf
@@ -4,6 +4,6 @@
 nodaemon=true
 
 [program:synchronizer]
-command=python /opt/xos/xos-observer.py
+command=python /opt/xos/synchronizers/openstack/xos-synchronizer.py
 stderr_logfile=/var/log/supervisor/synchronizer.err.log
 stdout_logfile=/var/log/supervisor/synchronizer.out.log
diff --git a/xos/core/xoslib/ngXosLib/.bowerrc b/gui/ngXosLib/.bowerrc
similarity index 100%
rename from xos/core/xoslib/ngXosLib/.bowerrc
rename to gui/ngXosLib/.bowerrc
diff --git a/xos/core/xoslib/ngXosLib/.gitignore b/gui/ngXosLib/.gitignore
similarity index 100%
rename from xos/core/xoslib/ngXosLib/.gitignore
rename to gui/ngXosLib/.gitignore
diff --git a/xos/core/xoslib/ngXosLib/README.md b/gui/ngXosLib/README.md
similarity index 100%
rename from xos/core/xoslib/ngXosLib/README.md
rename to gui/ngXosLib/README.md
diff --git a/xos/core/xoslib/ngXosLib/api/.gitignore b/gui/ngXosLib/api/.gitignore
similarity index 100%
rename from xos/core/xoslib/ngXosLib/api/.gitignore
rename to gui/ngXosLib/api/.gitignore
diff --git a/xos/core/xoslib/ngXosLib/api/ng-hpcapi.js b/gui/ngXosLib/api/ng-hpcapi.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/api/ng-hpcapi.js
rename to gui/ngXosLib/api/ng-hpcapi.js
diff --git a/xos/core/xoslib/ngXosLib/api/ng-xos.js b/gui/ngXosLib/api/ng-xos.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/api/ng-xos.js
rename to gui/ngXosLib/api/ng-xos.js
diff --git a/xos/core/xoslib/ngXosLib/api/ng-xoslib.js b/gui/ngXosLib/api/ng-xoslib.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/api/ng-xoslib.js
rename to gui/ngXosLib/api/ng-xoslib.js
diff --git a/xos/core/xoslib/ngXosLib/apiTemplates/custom-angular-class.mustache b/gui/ngXosLib/apiTemplates/custom-angular-class.mustache
similarity index 100%
rename from xos/core/xoslib/ngXosLib/apiTemplates/custom-angular-class.mustache
rename to gui/ngXosLib/apiTemplates/custom-angular-class.mustache
diff --git a/xos/core/xoslib/ngXosLib/bower.json b/gui/ngXosLib/bower.json
similarity index 100%
rename from xos/core/xoslib/ngXosLib/bower.json
rename to gui/ngXosLib/bower.json
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/index.js b/gui/ngXosLib/generator-xos/app/index.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/index.js
rename to gui/ngXosLib/generator-xos/app/index.js
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/.bowerrc b/gui/ngXosLib/generator-xos/app/templates/.bowerrc
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/.bowerrc
rename to gui/ngXosLib/generator-xos/app/templates/.bowerrc
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/.eslintrc b/gui/ngXosLib/generator-xos/app/templates/.eslintrc
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/.eslintrc
rename to gui/ngXosLib/generator-xos/app/templates/.eslintrc
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/.gitignore b/gui/ngXosLib/generator-xos/app/templates/.gitignore
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/.gitignore
rename to gui/ngXosLib/generator-xos/app/templates/.gitignore
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/bower.json b/gui/ngXosLib/generator-xos/app/templates/bower.json
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/bower.json
rename to gui/ngXosLib/generator-xos/app/templates/bower.json
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/env/default.js b/gui/ngXosLib/generator-xos/app/templates/env/default.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/env/default.js
rename to gui/ngXosLib/generator-xos/app/templates/env/default.js
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/gulp/build.js b/gui/ngXosLib/generator-xos/app/templates/gulp/build.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/gulp/build.js
rename to gui/ngXosLib/generator-xos/app/templates/gulp/build.js
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/gulp/server.js b/gui/ngXosLib/generator-xos/app/templates/gulp/server.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/gulp/server.js
rename to gui/ngXosLib/generator-xos/app/templates/gulp/server.js
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/gulpfile.js b/gui/ngXosLib/generator-xos/app/templates/gulpfile.js
similarity index 70%
copy from xos/core/xoslib/ngXosViews/ceilometerDashboard/gulpfile.js
copy to gui/ngXosLib/generator-xos/app/templates/gulpfile.js
index de911e9..b2cdab8 100644
--- a/xos/core/xoslib/ngXosViews/ceilometerDashboard/gulpfile.js
+++ b/gui/ngXosLib/generator-xos/app/templates/gulpfile.js
@@ -5,14 +5,13 @@
 
 var options = {
   src: 'src/',
-  css: 'src/css/',
   scripts: 'src/js/',
   tmp: 'src/.tmp',
   dist: 'dist/',
   api: '../../ngXosLib/api/',
   helpers: '../../ngXosLib/xosHelpers/src/',
-  static: '../../static/', // this is the django static folder
-  dashboards: '../../dashboards/' // this is the django html folder
+  static: '../../../xos/core/xoslib/static/', // this is the django static folder
+  dashboards: '../../../xos/core/xoslib/dashboards/' // this is the django html folder
 };
 
 wrench.readdirSyncRecursive('./gulp')
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/karma.conf.js b/gui/ngXosLib/generator-xos/app/templates/karma.conf.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/karma.conf.js
rename to gui/ngXosLib/generator-xos/app/templates/karma.conf.js
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/package.json b/gui/ngXosLib/generator-xos/app/templates/package.json
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/package.json
rename to gui/ngXosLib/generator-xos/app/templates/package.json
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/spec/sample.test.js b/gui/ngXosLib/generator-xos/app/templates/spec/sample.test.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/spec/sample.test.js
rename to gui/ngXosLib/generator-xos/app/templates/spec/sample.test.js
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/src/css/dev.css b/gui/ngXosLib/generator-xos/app/templates/src/css/dev.css
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/src/css/dev.css
rename to gui/ngXosLib/generator-xos/app/templates/src/css/dev.css
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/src/index.html b/gui/ngXosLib/generator-xos/app/templates/src/index.html
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/src/index.html
rename to gui/ngXosLib/generator-xos/app/templates/src/index.html
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/src/js/main.js b/gui/ngXosLib/generator-xos/app/templates/src/js/main.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/src/js/main.js
rename to gui/ngXosLib/generator-xos/app/templates/src/js/main.js
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/src/templates/users-list.tpl.html b/gui/ngXosLib/generator-xos/app/templates/src/templates/users-list.tpl.html
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/app/templates/src/templates/users-list.tpl.html
rename to gui/ngXosLib/generator-xos/app/templates/src/templates/users-list.tpl.html
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/package.json b/gui/ngXosLib/generator-xos/package.json
similarity index 100%
rename from xos/core/xoslib/ngXosLib/generator-xos/package.json
rename to gui/ngXosLib/generator-xos/package.json
diff --git a/xos/core/xoslib/ngXosLib/gulp/ngXosHelpers.js b/gui/ngXosLib/gulp/ngXosHelpers.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/gulp/ngXosHelpers.js
rename to gui/ngXosLib/gulp/ngXosHelpers.js
diff --git a/xos/core/xoslib/ngXosLib/gulp/ngXosVendor.js b/gui/ngXosLib/gulp/ngXosVendor.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/gulp/ngXosVendor.js
rename to gui/ngXosLib/gulp/ngXosVendor.js
diff --git a/xos/core/xoslib/ngXosLib/gulpfile.js b/gui/ngXosLib/gulpfile.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/gulpfile.js
rename to gui/ngXosLib/gulpfile.js
diff --git a/xos/core/xoslib/ngXosLib/karma.conf.js b/gui/ngXosLib/karma.conf.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/karma.conf.js
rename to gui/ngXosLib/karma.conf.js
diff --git a/xos/core/xoslib/ngXosLib/package.json b/gui/ngXosLib/package.json
similarity index 100%
rename from xos/core/xoslib/ngXosLib/package.json
rename to gui/ngXosLib/package.json
diff --git a/xos/core/xoslib/ngXosLib/xos-resource-generator.js b/gui/ngXosLib/xos-resource-generator.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/xos-resource-generator.js
rename to gui/ngXosLib/xos-resource-generator.js
diff --git a/xos/core/xoslib/ngXosLib/xos-swagger-def.js b/gui/ngXosLib/xos-swagger-def.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/xos-swagger-def.js
rename to gui/ngXosLib/xos-swagger-def.js
diff --git a/xos/core/xoslib/ngXosLib/xosHelpers/spec/csrftoken.test.js b/gui/ngXosLib/xosHelpers/spec/csrftoken.test.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/xosHelpers/spec/csrftoken.test.js
rename to gui/ngXosLib/xosHelpers/spec/csrftoken.test.js
diff --git a/xos/core/xoslib/ngXosLib/xosHelpers/src/services/api.services.js b/gui/ngXosLib/xosHelpers/src/services/api.services.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/xosHelpers/src/services/api.services.js
rename to gui/ngXosLib/xosHelpers/src/services/api.services.js
diff --git a/xos/core/xoslib/ngXosLib/xosHelpers/src/services/csrfToken.interceptor.js b/gui/ngXosLib/xosHelpers/src/services/csrfToken.interceptor.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/xosHelpers/src/services/csrfToken.interceptor.js
rename to gui/ngXosLib/xosHelpers/src/services/csrfToken.interceptor.js
diff --git a/xos/core/xoslib/ngXosLib/xosHelpers/src/services/noHyperlinks.interceptor.js b/gui/ngXosLib/xosHelpers/src/services/noHyperlinks.interceptor.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/xosHelpers/src/services/noHyperlinks.interceptor.js
rename to gui/ngXosLib/xosHelpers/src/services/noHyperlinks.interceptor.js
diff --git a/xos/core/xoslib/ngXosLib/xosHelpers/src/xosHelpers.module.js b/gui/ngXosLib/xosHelpers/src/xosHelpers.module.js
similarity index 100%
rename from xos/core/xoslib/ngXosLib/xosHelpers/src/xosHelpers.module.js
rename to gui/ngXosLib/xosHelpers/src/xosHelpers.module.js
diff --git a/xos/core/xoslib/ngXosViews/.gitignore b/gui/ngXosViews/.gitignore
similarity index 100%
rename from xos/core/xoslib/ngXosViews/.gitignore
rename to gui/ngXosViews/.gitignore
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/.bowerrc b/gui/ngXosViews/ceilometerDashboard/.bowerrc
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/.bowerrc
rename to gui/ngXosViews/ceilometerDashboard/.bowerrc
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/.eslintrc b/gui/ngXosViews/ceilometerDashboard/.eslintrc
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/.eslintrc
rename to gui/ngXosViews/ceilometerDashboard/.eslintrc
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/.gitignore b/gui/ngXosViews/ceilometerDashboard/.gitignore
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/.gitignore
rename to gui/ngXosViews/ceilometerDashboard/.gitignore
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/bower.json b/gui/ngXosViews/ceilometerDashboard/bower.json
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/bower.json
rename to gui/ngXosViews/ceilometerDashboard/bower.json
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/env/default.js b/gui/ngXosViews/ceilometerDashboard/env/default.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/env/default.js
rename to gui/ngXosViews/ceilometerDashboard/env/default.js
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/env/srikanth.js b/gui/ngXosViews/ceilometerDashboard/env/srikanth.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/env/srikanth.js
rename to gui/ngXosViews/ceilometerDashboard/env/srikanth.js
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/gulp/build.js b/gui/ngXosViews/ceilometerDashboard/gulp/build.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/gulp/build.js
rename to gui/ngXosViews/ceilometerDashboard/gulp/build.js
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/gulp/server.js b/gui/ngXosViews/ceilometerDashboard/gulp/server.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/gulp/server.js
rename to gui/ngXosViews/ceilometerDashboard/gulp/server.js
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/gulpfile.js b/gui/ngXosViews/ceilometerDashboard/gulpfile.js
similarity index 71%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/gulpfile.js
rename to gui/ngXosViews/ceilometerDashboard/gulpfile.js
index de911e9..a3523ee 100644
--- a/xos/core/xoslib/ngXosViews/ceilometerDashboard/gulpfile.js
+++ b/gui/ngXosViews/ceilometerDashboard/gulpfile.js
@@ -11,8 +11,8 @@
   dist: 'dist/',
   api: '../../ngXosLib/api/',
   helpers: '../../ngXosLib/xosHelpers/src/',
-  static: '../../static/', // this is the django static folder
-  dashboards: '../../dashboards/' // this is the django html folder
+  static: '../../../xos/core/xoslib/static/', // this is the django static folder
+  dashboards: '../../../xos/core/xoslib/dashboards/' // this is the django html folder
 };
 
 wrench.readdirSyncRecursive('./gulp')
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/karma.conf.js b/gui/ngXosViews/ceilometerDashboard/karma.conf.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/karma.conf.js
rename to gui/ngXosViews/ceilometerDashboard/karma.conf.js
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/package.json b/gui/ngXosViews/ceilometerDashboard/package.json
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/package.json
rename to gui/ngXosViews/ceilometerDashboard/package.json
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/spec/.eslintrc b/gui/ngXosViews/ceilometerDashboard/spec/.eslintrc
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/spec/.eslintrc
rename to gui/ngXosViews/ceilometerDashboard/spec/.eslintrc
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/spec/backend.mock.js b/gui/ngXosViews/ceilometerDashboard/spec/backend.mock.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/spec/backend.mock.js
rename to gui/ngXosViews/ceilometerDashboard/spec/backend.mock.js
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/spec/ceilometer.test.js b/gui/ngXosViews/ceilometerDashboard/spec/ceilometer.test.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/spec/ceilometer.test.js
rename to gui/ngXosViews/ceilometerDashboard/spec/ceilometer.test.js
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/src/css/ceilometerDashboard.css b/gui/ngXosViews/ceilometerDashboard/src/css/ceilometerDashboard.css
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/src/css/ceilometerDashboard.css
rename to gui/ngXosViews/ceilometerDashboard/src/css/ceilometerDashboard.css
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/src/css/dev.css b/gui/ngXosViews/ceilometerDashboard/src/css/dev.css
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/src/css/dev.css
rename to gui/ngXosViews/ceilometerDashboard/src/css/dev.css
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/src/index.html b/gui/ngXosViews/ceilometerDashboard/src/index.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/src/index.html
rename to gui/ngXosViews/ceilometerDashboard/src/index.html
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/src/js/main.js b/gui/ngXosViews/ceilometerDashboard/src/js/main.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/src/js/main.js
rename to gui/ngXosViews/ceilometerDashboard/src/js/main.js
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/src/meters_mock.json b/gui/ngXosViews/ceilometerDashboard/src/meters_mock.json
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/src/meters_mock.json
rename to gui/ngXosViews/ceilometerDashboard/src/meters_mock.json
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/src/stats_mock.json b/gui/ngXosViews/ceilometerDashboard/src/stats_mock.json
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/src/stats_mock.json
rename to gui/ngXosViews/ceilometerDashboard/src/stats_mock.json
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/src/templates/accordion-group.html b/gui/ngXosViews/ceilometerDashboard/src/templates/accordion-group.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/src/templates/accordion-group.html
rename to gui/ngXosViews/ceilometerDashboard/src/templates/accordion-group.html
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/src/templates/accordion.html b/gui/ngXosViews/ceilometerDashboard/src/templates/accordion.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/src/templates/accordion.html
rename to gui/ngXosViews/ceilometerDashboard/src/templates/accordion.html
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/src/templates/ceilometer-dashboard.tpl.html b/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-dashboard.tpl.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/src/templates/ceilometer-dashboard.tpl.html
rename to gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-dashboard.tpl.html
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/src/templates/ceilometer-samples.tpl.html b/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-samples.tpl.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/src/templates/ceilometer-samples.tpl.html
rename to gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-samples.tpl.html
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/src/templates/ceilometer-stats.tpl.html b/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-stats.tpl.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/src/templates/ceilometer-stats.tpl.html
rename to gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-stats.tpl.html
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/teone@clnode015.clemson.cloudlab.us b/gui/ngXosViews/ceilometerDashboard/teone@clnode015.clemson.cloudlab.us
similarity index 100%
rename from xos/core/xoslib/ngXosViews/ceilometerDashboard/teone@clnode015.clemson.cloudlab.us
rename to gui/ngXosViews/ceilometerDashboard/teone@clnode015.clemson.cloudlab.us
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/.bowerrc b/gui/ngXosViews/contentProvider/.bowerrc
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/.bowerrc
rename to gui/ngXosViews/contentProvider/.bowerrc
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/.eslintrc b/gui/ngXosViews/contentProvider/.eslintrc
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/.eslintrc
rename to gui/ngXosViews/contentProvider/.eslintrc
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/.gitignore b/gui/ngXosViews/contentProvider/.gitignore
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/.gitignore
rename to gui/ngXosViews/contentProvider/.gitignore
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/bower.json b/gui/ngXosViews/contentProvider/bower.json
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/bower.json
rename to gui/ngXosViews/contentProvider/bower.json
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/gulp/build.js b/gui/ngXosViews/contentProvider/gulp/build.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/gulp/build.js
rename to gui/ngXosViews/contentProvider/gulp/build.js
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/gulp/server.js b/gui/ngXosViews/contentProvider/gulp/server.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/gulp/server.js
rename to gui/ngXosViews/contentProvider/gulp/server.js
diff --git a/xos/core/xoslib/ngXosViews/ceilometerDashboard/gulpfile.js b/gui/ngXosViews/contentProvider/gulpfile.js
similarity index 70%
copy from xos/core/xoslib/ngXosViews/ceilometerDashboard/gulpfile.js
copy to gui/ngXosViews/contentProvider/gulpfile.js
index de911e9..b2cdab8 100644
--- a/xos/core/xoslib/ngXosViews/ceilometerDashboard/gulpfile.js
+++ b/gui/ngXosViews/contentProvider/gulpfile.js
@@ -5,14 +5,13 @@
 
 var options = {
   src: 'src/',
-  css: 'src/css/',
   scripts: 'src/js/',
   tmp: 'src/.tmp',
   dist: 'dist/',
   api: '../../ngXosLib/api/',
   helpers: '../../ngXosLib/xosHelpers/src/',
-  static: '../../static/', // this is the django static folder
-  dashboards: '../../dashboards/' // this is the django html folder
+  static: '../../../xos/core/xoslib/static/', // this is the django static folder
+  dashboards: '../../../xos/core/xoslib/dashboards/' // this is the django html folder
 };
 
 wrench.readdirSyncRecursive('./gulp')
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/karma.conf.js b/gui/ngXosViews/contentProvider/karma.conf.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/karma.conf.js
rename to gui/ngXosViews/contentProvider/karma.conf.js
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/package.json b/gui/ngXosViews/contentProvider/package.json
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/package.json
rename to gui/ngXosViews/contentProvider/package.json
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/spec/contentprovider.test.js b/gui/ngXosViews/contentProvider/spec/contentprovider.test.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/spec/contentprovider.test.js
rename to gui/ngXosViews/contentProvider/spec/contentprovider.test.js
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/spec/mocks/contentProvider.mock.js b/gui/ngXosViews/contentProvider/spec/mocks/contentProvider.mock.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/spec/mocks/contentProvider.mock.js
rename to gui/ngXosViews/contentProvider/spec/mocks/contentProvider.mock.js
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/spec/sample.test.js b/gui/ngXosViews/contentProvider/spec/sample.test.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/spec/sample.test.js
rename to gui/ngXosViews/contentProvider/spec/sample.test.js
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/src/css/dev.css b/gui/ngXosViews/contentProvider/src/css/dev.css
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/src/css/dev.css
rename to gui/ngXosViews/contentProvider/src/css/dev.css
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/src/index.html b/gui/ngXosViews/contentProvider/src/index.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/src/index.html
rename to gui/ngXosViews/contentProvider/src/index.html
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/src/js/main.js b/gui/ngXosViews/contentProvider/src/js/main.js
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/src/js/main.js
rename to gui/ngXosViews/contentProvider/src/js/main.js
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_actions.html b/gui/ngXosViews/contentProvider/src/templates/cp_actions.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_actions.html
rename to gui/ngXosViews/contentProvider/src/templates/cp_actions.html
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_cdn_prefix.html b/gui/ngXosViews/contentProvider/src/templates/cp_cdn_prefix.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_cdn_prefix.html
rename to gui/ngXosViews/contentProvider/src/templates/cp_cdn_prefix.html
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_detail.html b/gui/ngXosViews/contentProvider/src/templates/cp_detail.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_detail.html
rename to gui/ngXosViews/contentProvider/src/templates/cp_detail.html
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_list.html b/gui/ngXosViews/contentProvider/src/templates/cp_list.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_list.html
rename to gui/ngXosViews/contentProvider/src/templates/cp_list.html
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_origin_server.html b/gui/ngXosViews/contentProvider/src/templates/cp_origin_server.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_origin_server.html
rename to gui/ngXosViews/contentProvider/src/templates/cp_origin_server.html
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_side_nav.html b/gui/ngXosViews/contentProvider/src/templates/cp_side_nav.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_side_nav.html
rename to gui/ngXosViews/contentProvider/src/templates/cp_side_nav.html
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_user.html b/gui/ngXosViews/contentProvider/src/templates/cp_user.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/src/templates/cp_user.html
rename to gui/ngXosViews/contentProvider/src/templates/cp_user.html
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/src/templates/users-list.tpl.html b/gui/ngXosViews/contentProvider/src/templates/users-list.tpl.html
similarity index 100%
rename from xos/core/xoslib/ngXosViews/contentProvider/src/templates/users-list.tpl.html
rename to gui/ngXosViews/contentProvider/src/templates/users-list.tpl.html
diff --git a/xos/configurations/cord/Makefile b/xos/configurations/cord/Makefile
index c95d9dd..41bb37f 100644
--- a/xos/configurations/cord/Makefile
+++ b/xos/configurations/cord/Makefile
@@ -14,6 +14,10 @@
 	sudo MYIP=$(MYIP) docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/cord/cord.yaml
 	sudo MYIP=$(MYIP) docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/cord/ceilometer.yaml
 
+containers:
+	cd ../../../containers/xos; make devel
+	cd ../../../containers/synchronizer; make
+
 common_cloudlab:
 	make -C ../common -f Makefile.cloudlab
 
diff --git a/xos/configurations/cord/docker-compose.yml b/xos/configurations/cord/docker-compose.yml
index e09dc1a..2b14f40 100644
--- a/xos/configurations/cord/docker-compose.yml
+++ b/xos/configurations/cord/docker-compose.yml
@@ -4,7 +4,7 @@
         - "5432"
 
 xos_synchronizer_openstack:
-    command: bash -c "sleep 120 ; python /opt/xos/xos-observer.py"
+    command: python /opt/xos/synchronizers/openstack/xos-synchronizer.py
     image: xosproject/xos-synchronizer-openstack
     labels:
         org.xosproject.kind: synchronizer
@@ -20,7 +20,7 @@
 
 xos_synchronizer_onos:
     image: xosproject/xos-synchronizer-openstack
-    command: bash -c "sleep 120 ; python /opt/xos/observers/onos/onos-observer.py -C /opt/xos/observers/onos/onos_observer_config"
+    command: python /opt/xos/synchronizers/onos/onos-synchronizer.py -C /opt/xos/synchronizers/onos/onos_synchronizer_config
     labels:
         org.xosproject.kind: synchronizer
         org.xosproject.target: onos
@@ -33,8 +33,7 @@
 
 xos_synchronizer_vcpe:
     image: xosproject/xos-synchronizer-openstack
-    #command: /usr/bin/supervisord -c /opt/xos/observers/vcpe/supervisor/vcpe-observer.conf
-    command: bash -c "sleep 120 ; python /opt/xos/observers/vcpe/vcpe-observer.py -C /opt/xos/observers/vcpe/vcpe_observer_config"
+    command: python /opt/xos/synchronizers/vcpe/vcpe-synchronizer.py -C /opt/xos/synchronizers/vcpe/vcpe_synchronizer_config
     labels:
         org.xosproject.kind: synchronizer
         org.xosproject.target: vcpe
@@ -45,10 +44,10 @@
     volumes:
         - ../setup/id_rsa:/opt/xos/observers/vcpe/vcpe_private_key:ro  # private key
         - ../setup:/root/setup:ro
-        
+
 xos_synchronizer_vbng:
     image: xosproject/xos-synchronizer-openstack
-    command: bash -c "sleep 120 ; python /opt/xos/observers/vbng/vbng-observer.py -C /opt/xos/observers/vbng/vbng_observer_config"
+    command: python /opt/xos/synchronizers/vbng/vbng-synchronizer.py -C /opt/xos/synchronizers/vbng/vbng_synchronizer_config
     labels:
         org.xosproject.kind: synchronizer
         org.xosproject.target: vbng
@@ -59,8 +58,7 @@
 
 xos_synchronizer_monitoring_channel:
     image: xosproject/xos-synchronizer-openstack
-    #command: /usr/bin/supervisord -c /opt/xos/observers/monitoring_channel/supervisor/monitoring_channel_observer.conf
-    command: bash -c "sleep 120 ; python /opt/xos/observers/monitoring_channel/monitoring_channel_observer.py -C /opt/xos/observers/monitoring_channel/monitoring_channel_observer_config"
+    command: python /opt/xos/synchronizers/monitoring_channel/monitoring_channel_synchronizer.py -C /opt/xos/synchronizers/monitoring_channel/monitoring_channel_synchronizer_config
     labels:
         org.xosproject.kind: synchronizer
         org.xosproject.target: monitoring_channel
diff --git a/xos/configurations/devel/Makefile b/xos/configurations/devel/Makefile
index b4f3fcf..1e650f3 100644
--- a/xos/configurations/devel/Makefile
+++ b/xos/configurations/devel/Makefile
@@ -10,6 +10,10 @@
 	sudo MYIP=$(MYIP) docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/common/base.yaml
 	sudo MYIP=$(MYIP) docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /root/setup/nodes.yaml
 
+containers:
+	cd ../../../containers/xos; make devel
+	cd ../../../containers/synchronizer; make
+
 common_cloudlab:
 	make -C ../common -f Makefile.cloudlab
 
@@ -40,5 +44,5 @@
 rebuild_xos:
 	make -C ../../../containers/xos devel
 
-rebuild_synchronizer: 
+rebuild_synchronizer:
 	make -C ../../../containers/synchronizer
diff --git a/xos/configurations/devel/README.md b/xos/configurations/devel/README.md
index 2361396..84bf6fc 100644
--- a/xos/configurations/devel/README.md
+++ b/xos/configurations/devel/README.md
@@ -65,6 +65,8 @@
 
 Delete the containers and relaunch them: `make rm; make [cloudlab|devstack]`
 
+Build the containers from scratch using the local XOS source tree: `make containers`
+
 View logs: `make showlogs`
 
 See what containers are running: `make ps`
diff --git a/xos/configurations/devel/docker-compose.yml b/xos/configurations/devel/docker-compose.yml
index 66f6702..f3342fc 100644
--- a/xos/configurations/devel/docker-compose.yml
+++ b/xos/configurations/devel/docker-compose.yml
@@ -5,7 +5,7 @@
 
 xos_synchronizer_openstack:
     image: xosproject/xos-synchronizer-openstack
-    command: bash -c "sleep 120; python /opt/xos/xos-observer.py"
+    command: python /opt/xos/synchronizers/openstack/xos-synchronizer.py
     labels:
         org.xosproject.kind: synchronizer
         org.xosproject.target: openstack
diff --git a/xos/configurations/frontend/Makefile b/xos/configurations/frontend/Makefile
index 4c95f90..130153a 100644
--- a/xos/configurations/frontend/Makefile
+++ b/xos/configurations/frontend/Makefile
@@ -6,6 +6,9 @@
 	bash ../common/wait_for_xos.sh
 	sudo docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/configurations/frontend/sample.yaml
 
+containers:
+	cd ../../../containers/xos; make devel
+
 stop:
 	sudo docker-compose stop
 
diff --git a/xos/configurations/frontend/README.md b/xos/configurations/frontend/README.md
index 1cf244d..a0ee72e 100644
--- a/xos/configurations/frontend/README.md
+++ b/xos/configurations/frontend/README.md
@@ -25,6 +25,8 @@
 
 Delete the containers and relaunch them: `make rm; make`
 
+Build the containers from scratch using the local XOS source tree: `make containers`
+
 View logs: `make showlogs`
 
 See what containers are running: `make ps`
diff --git a/xos/configurations/test/Makefile b/xos/configurations/test/Makefile
index a79e322..adf349a 100644
--- a/xos/configurations/test/Makefile
+++ b/xos/configurations/test/Makefile
@@ -12,6 +12,10 @@
 	sudo MYIP=$(MYIP) docker-compose run xos bash -c "cd /opt/xos/tosca/tests; python ./alltests.py"
 	sudo MYIP=$(MYIP) docker-compose run xos bash -c "cd /opt/xos/tosca/tests; python ./allObserverTests.py"
 
+containers:
+	cd ../../../containers/xos; make devel
+	cd ../../../containers/synchronizer; make
+
 common_cloudlab:
 	make -C ../common -f Makefile.cloudlab
 
diff --git a/xos/configurations/vtn/Makefile b/xos/configurations/vtn/Makefile
index 59feb2d..335f83d 100644
--- a/xos/configurations/vtn/Makefile
+++ b/xos/configurations/vtn/Makefile
@@ -12,6 +12,10 @@
 	sudo MYIP=$(MYIP) docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /root/setup/nodes.yaml
 	sudo MYIP=$(MYIP) docker-compose run xos python /opt/xos/tosca/run.py padmin@vicci.org /opt/xos/tosca/samples/vtn.yaml
 
+containers:
+	cd ../../../containers/xos; make devel
+	cd ../../../containers/synchronizer; make
+
 common_cloudlab:
 	make -C ../common -f Makefile.cloudlab
 
diff --git a/xos/configurations/vtn/README.md b/xos/configurations/vtn/README.md
index 0fac0a5..f4c8248 100644
--- a/xos/configurations/vtn/README.md
+++ b/xos/configurations/vtn/README.md
@@ -30,7 +30,7 @@
 steps outlined in [the VTN README](../cord/README-VTN.md).  Run:
 ```
 ctl:~/xos/xos/configurations/vtn$ make destroy-networks
-ctl:~/xos/xos/configurations/vtn$ sudo ansible-playbook setup.yml 
+ctl:~/xos/xos/configurations/vtn$ sudo ansible-playbook setup.yml
 ```
 
 
@@ -69,6 +69,8 @@
 
 Delete the containers and relaunch them: `make rm; make [cloudlab|devstack]`
 
+Build the containers from scratch using the local XOS source tree: `make containers`
+
 View logs: `make showlogs`
 
 See what containers are running: `make ps`
diff --git a/xos/configurations/vtn/docker-compose.yml b/xos/configurations/vtn/docker-compose.yml
index 976de78..c54927b 100644
--- a/xos/configurations/vtn/docker-compose.yml
+++ b/xos/configurations/vtn/docker-compose.yml
@@ -5,7 +5,7 @@
 
 xos_synchronizer_openstack:
     image: xosproject/xos-synchronizer-openstack
-    command: bash -c "python /opt/xos/xos-observer.py"
+    command: bash -c "python /opt/xos/synchronizers/openstack/xos-synchronizer.py"
     labels:
         org.xosproject.kind: synchronizer
         org.xosproject.target: openstack
diff --git a/xos/core/__init__.py b/xos/core/__init__.py
index e69de29..e01f9cd 100644
--- a/xos/core/__init__.py
+++ b/xos/core/__init__.py
@@ -0,0 +1 @@
+# from tests import *
diff --git a/xos/core/fixtures/initial_data.json b/xos/core/fixtures/core_initial_data.json
similarity index 100%
rename from xos/core/fixtures/initial_data.json
rename to xos/core/fixtures/core_initial_data.json
diff --git a/xos/core/models/__init__.py b/xos/core/models/__init__.py
index c380e9c..a022cae 100644
--- a/xos/core/models/__init__.py
+++ b/xos/core/models/__init__.py
@@ -2,7 +2,7 @@
 from .project import Project
 from .singletonmodel import SingletonModel
 from .service import Service, Tenant, TenantWithContainer, CoarseTenant, ServicePrivilege, TenantRoot, TenantRootPrivilege, TenantRootRole, Subscriber, Provider
-from .service import ServiceAttribute, TenantAttribute
+from .service import ServiceAttribute, TenantAttribute, ServiceRole
 from .tag import Tag
 from .role import Role
 from .site import Site, Deployment, DeploymentRole, DeploymentPrivilege, Controller, ControllerRole, ControllerSite, SiteDeployment
diff --git a/xos/core/models/slice.py b/xos/core/models/slice.py
index 84622cf..42e3a25 100644
--- a/xos/core/models/slice.py
+++ b/xos/core/models/slice.py
@@ -15,6 +15,7 @@
 from core.models import Flavor, Image
 from core.models.plcorebase import StrippedCharField
 from django.core.exceptions import PermissionDenied, ValidationError
+from xos.exceptions import *
 
 # Create your models here.
 
@@ -52,13 +53,13 @@
         site = Site.objects.get(id=self.site.id)
         # allow preexisting slices to keep their original name for now
         if not self.id and not self.name.startswith(site.login_base):
-            raise ValidationError('slice name must begin with %s' % site.login_base)
+            raise XOSValidationError('slice name must begin with %s' % site.login_base)
 
         if self.name == site.login_base+"_":
-            raise ValidationError('slice name is too short')
+            raise XOSValidationError('slice name is too short')
 
         if " " in self.name:
-            raise ValidationError('slice name must not contain spaces')
+            raise XOSValidationError('slice name must not contain spaces')
 
         if self.serviceClass is None:
             # We allowed None=True for serviceClass because Django evolution
@@ -82,7 +83,7 @@
                 raise PermissionDenied("Insufficient privileges to change slice creator")
         
         if not self.creator:
-            raise ValidationError('slice has no creator')
+            raise XOSValidationError('slice has no creator')
 
         if self.network=="Private Only":
             # "Private Only" was the default from the old Tenant View
diff --git a/xos/core/tests.py b/xos/core/tests.py
index e3d7faa..06bf678 100644
--- a/xos/core/tests.py
+++ b/xos/core/tests.py
@@ -1,128 +1,337 @@
+# TEST
+# To execute these tests use `python manage.py test core`
+
 #!/usr/bin/env python
 from django.test import TestCase
-from core.models import *
-from rest_framework.test import *
-from genapi import *
+from django.contrib.auth.models import User
+from rest_framework import status
+from rest_framework.test import APIClient
+from rest_framework.test import APITestCase
 import json
-from datetime import datetime
+from django.forms.models import model_to_dict
 
-FIXTURES_FILE = 'core/fixtures/initial_data.json'
-MODELS = ['Deployment','Image','Node','Reservation','Slice','Instance','User']
+from core.models import *
 
-def is_dynamic_type(x):
-	t = type(x)
-	return t in [datetime]
+print "-------------------------- Let's test!!!!!!!! --------------------------"
 
-class APITestCase(TestCase):
-	def setUp(self):
-		self.init_data=json.loads(open(FIXTURES_FILE).read())
-		self.data_dict={}
-		self.hidden_keys={}
+from django.apps import apps
+from django.test.client import Client
+from django.test import testcases
+from django.http import SimpleCookie, HttpRequest, QueryDict
+from importlib import import_module
+from django.conf import settings
+class FixedClient(Client):
+    def login(self, **credentials):
+        """
+        Sets the Factory to appear as if it has successfully logged into a site.
 
-		for d in self.init_data:
-			model_tag = d['model']
-			model_name = model_tag.split('.')[1]
+        Returns True if login is possible; False if the provided credentials
+        are incorrect, or the user is inactive, or if the sessions framework is
+        not available.
+        """
+        from django.contrib.auth import authenticate, login
+        user = authenticate(**credentials)
+        if (user and user.is_active and
+                apps.is_installed('django.contrib.sessions')):
+            engine = import_module(settings.SESSION_ENGINE)
 
-			try:
-				self.data_dict[model_name].append(d)
-			except:
-				self.data_dict[model_name]=[d]
+            # Create a fake request to store login details.
+            request = HttpRequest()
 
-		# Any admin user would do
-		self.calling_user = User('sapan@onlab.us')
-		self.client = APIClient()
-		self.client.force_authenticate(user=self.calling_user)
+            # XOS's admin.py requires these to be filled in
+            request.POST = {"username": credentials["username"],
+                            "password": credentials["password"]}
+
+            if self.session:
+                request.session = self.session
+            else:
+                request.session = engine.SessionStore()
+            login(request, user)
+
+            # Save the session values.
+            request.session.save()
+
+            # Set the cookie to represent the session.
+            session_cookie = settings.SESSION_COOKIE_NAME
+            self.cookies[session_cookie] = request.session.session_key
+            cookie_data = {
+                'max-age': None,
+                'path': '/',
+                'domain': settings.SESSION_COOKIE_DOMAIN,
+                'secure': settings.SESSION_COOKIE_SECURE or None,
+                'expires': None,
+                }
+            self.cookies[session_cookie].update(cookie_data)
+
+            return True
+        else:
+            return False
+
+class FixedAPITestCase(testcases.TestCase):
+    client_class = FixedClient
+
+# Environment Tests - Should pass everytime, if not something in the config is broken.
+class SimpleTest(TestCase):
+    fixtures = []
+
+    def test_basic_addition(self):
+        """
+        Tests that 1 + 1 always equals 2.
+        """
+        self.assertEqual(1 + 1, 2)
 
 
-	def check_items(self, response, data_list):
-		rdict = {}
-		for r in response:
-			rdict['%d'%r['id']]=r
+# Site Test
+class SiteTest(TestCase):
+    fixtures = []
 
-		for d in data_list:
-			match = True
-			try:
-				item = rdict['%d'%d['pk']]
-			except Exception,e:
-				print 'API missing item %d / %r'%(d['pk'],rdict.keys())
-				raise e
+    def setUp(self):
+        Site.objects.create(
+            name="Test Site",
+            login_base="test_"
+        )
 
-			fields=d['fields']
-			fields['id']=d['pk']
-
-			for k in item.keys():
-				try:
-					resp_val = fields[k]
-				except KeyError:
-					if (not self.hidden_keys.has_key(k)):
-						print 'Hidden key %s'%k
-						self.hidden_keys[k]=True
-
-					continue
-
-				if (item[k]!=resp_val and not is_dynamic_type(item[k])):
-					if (type(resp_val)==type(item[k])):
-						print 'Key %s did not match: 1. %r 2. %r'%(k,item[k],resp_val)
-						print fields
-						match = False
+    def test_read_site(self):
+        """
+        Should read a site in the DB.
+        """
+        site = Site.objects.get(name="Test Site")
+        # print(site._meta.get_all_field_names())
+        self.assertEqual(site.login_base, "test_")
 
 
+class UnautheticatedRequest(FixedAPITestCase):
+    fixtures = []
 
-	def create(self, model, mplural, record):
-		request = self.client.put('/xos/%s/'%mplural,record['fields'])
+    def test_require_authentication(self):
+        """
+        Ensure that request must be authenticated
+        """
+        response = self.client.get('/xos/sites/', format='json')
+        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
 
-		#if (len2==len1):
-		#	raise Exception('Could not delete %s/%d'%(model,pk))
 
-		return
+class SiteTestAPI(FixedAPITestCase):
+    fixtures = []
 
-	def update(self, model, mplural, pk):
-		src_record = self.data_dict[model.lower()][0]
-		record_to_update = src_record['fields']
-		now = datetime.now()
-		record_to_update['enacted']=now
-		response = self.client.put('/xos/%s/%d/'%(mplural,pk),record_to_update)
-		self.assertEqual(response.data['enacted'],now)
+    def setUp(self):
+        self.site = Site.objects.create(
+            name="Test Site",
+            login_base="test_"
+        )
+        self.user = User(
+            username='testuser',
+            email='test@mail.org',
+            password='testing',
+            site=self.site,
+            is_admin=True
+        )
+        self.user.save()
+        self.client.login(username='test@mail.org', password='testing')
 
-		return
+    def test_read_site_API(self):
+        """
+        Read a Site trough API
+        """
+        response = self.client.get('/xos/sites/', format='json')
+        parsed = json.loads(response.content)
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertEqual(len(parsed), 1)
+        self.assertEqual(parsed[0]['login_base'], 'test_')
 
-	def delete(self, model, mplural, pk):
-		mclass = globals()[model]
-		len1 = len(mclass.objects.all())
-		response = self.client.delete('/xos/%s/%d/'%(mplural,pk))
-		len2 = len(mclass.objects.all())
-		self.assertNotEqual(len1,len2)
+    def test_create_site_API(self):
+        """
+        Create a Site trough API
+        """
+        data = {
+            'name': "Another Test Site",
+            'login_base': "another_test_",
+            'location': [10, 20],
+            'abbreviated_name': 'test'
+        }
+        response = self.client.post('/xos/sites/', data, format='json')
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        self.assertEqual(Site.objects.count(), 2)
+        self.assertEqual(Site.objects.filter(name="Another Test Site").count(), 1)
 
-		return
 
-	def retrieve(self, m, mplural, mlower):
-		response = self.client.get('/xos/%s/'%mplural)
-		#force_authenticate(request,user=self.calling_user)
-		self.check_items(response.data,self.data_dict[mlower])
+class SliceTestAPI(FixedAPITestCase):
+    fixtures = []
 
-		return
+    def setUp(self):
+        self.site = Site.objects.create(
+            name="Test Site",
+            login_base="test_"
+        )
+        self.pi = SiteRole.objects.create(role='pi')
+        self.user = User(
+            username='testuser',
+            email='test@mail.org',
+            password='testing',
+            site=self.site
+        )
+        self.user.save()
+        self.siteprivileges = SitePrivilege.objects.create(
+            user=self.user,
+            site=self.site,
+            role=self.pi
+        )
+        self.serviceClass = ServiceClass.objects.create(
+            name='Test Service Class'
+        )
+        self.client.login(username='test@mail.org', password='testing')
 
-	def test_initial_retrieve(self):
-		for m in MODELS:
-			print 'Checking retrieve on %s...'%m
-			self.retrieve(m, m.lower()+'s',m.lower())
+    def test_create_site_slice(self):
+        """
+        Add a slice to a given site
+        """
+        data = {
+            'name': "test_slice",
+            'site': self.site.id,
+            'serviceClass': self.serviceClass.id
+        }
+        response = self.client.post('/xos/slices/?no_hyperlinks=1', data, format='json')
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
 
-	
-	def test_update(self):
-		for m in MODELS:
-			print 'Checking update on %s...'%m
-			first = self.data_dict[m.lower()][0]['pk']
-			self.update(m, m.lower()+'s',int(first))
-	
-	def test_delete(self):
-		for m in MODELS:
-			print 'Checking delete on %s...'%m
-			first = self.data_dict[m.lower()][0]['pk']
-			self.delete(m, m.lower()+'s',int(first))
+    def test_validation_slice_name(self):
+        """
+        The slice name should start with site.login_base
+        curl -H "Accept: application/json; indent=4" -u padmin@vicci.org:letmein 'http://xos:9999/xos/slices/?no_hyperlinks=1' -H "Content-Type: application/json" -X POST --data '{"name": "test", "site":"1", "serviceClass":1}'
+        """
+        data = {
+            'name': "wrong_slice",
+            'site': self.site.id,
+            'serviceClass': self.serviceClass.id
+        }
+        response = self.client.post('/xos/slices/?no_hyperlinks=1', data, format='json')
+        parsed = json.loads(response.content)
+        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
+        self.assertEqual(parsed['detail']['specific_error'], "slice name must begin with test_")
 
-	def test_create(self):
-		for m in MODELS:
-			print 'Checking create on %s...'%m
-			first = self.data_dict[m.lower()][0]
-			self.create(m, m.lower()+'s',first)
+    def test_only_admin_can_change_creator(self):
+        """
+        Only an admin can change the creator of a slice
+        """
+        slice = Slice.objects.create(
+            name="test_slice",
+            site=self.site,
+            serviceClass=self.serviceClass,
+            creator=self.user
+        )
 
+        user2 = User(
+            username='another_testuser',
+            email='another_test@mail.org',
+            password='testing',
+            site=self.site
+        )
+        user2.save()
+
+        data = model_to_dict(slice)
+        data['creator'] = user2.id
+        json_data = json.dumps(data)
+
+        response = self.client.put('/xos/slices/%s/?no_hyperlinks=1' % slice.id, json_data, format='json', content_type="application/json")
+        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
+        parsed = json.loads(response.content)
+        self.assertEqual(parsed['detail']['specific_error'], "Insufficient privileges to change slice creator")
+
+class ServiceTestAPI(FixedAPITestCase):
+    fixtures = []
+
+    def setUp(self):
+        self.site = Site.objects.create(
+            name="Test Site",
+            login_base="test_"
+        )
+        self.admin = User(
+            username='testadmin',
+            email='admin@mail.org',
+            password='testing',
+            site=self.site,
+            is_admin=True
+        )
+        self.admin.save()
+
+        self.user = User(
+            username='testuser',
+            email='user@mail.org',
+            password='testing',
+            site=self.site
+        )
+        self.user.save()
+
+        self.service1 = Service.objects.create(
+            name="fakeService1",
+            versionNumber="1.0.0",
+            published=True,
+            enabled=True
+        )
+
+        self.service2 = Service.objects.create(
+            name="fakeService1",
+            versionNumber="1.0.0",
+            published=True,
+            enabled=True
+        )
+
+        self.service_role = ServiceRole.objects.create(role='admin')
+
+        self.service_privileges = ServicePrivilege.objects.create(
+            user=self.user,
+            service=self.service2,
+            role=self.service_role
+        )
+
+    # TODO
+    # [x] admin view all service
+    # [ ] user view only service2
+    # [x] admin view a specific service service
+    # [ ] user view can't view a specific service
+    # [ ] user update service2
+    # [ ] usercan NOT update service2
+    # [x] admin update service1
+    def test_admin_read_all_service(self):
+        """
+        Admin should read all the services
+        """
+        self.client.login(username='admin@mail.org', password='testing')
+        response = self.client.get('/xos/services/', format='json')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertEqual(len(json.loads(response.content)), 2)
+
+    # need to understand how slices are related
+    def xtest_user_read_all_service(self):
+        """
+        User should read only service for which have privileges
+        """
+        self.client.login(username='user@mail.org', password='testing')
+        response = self.client.get('/xos/services/', format='json')
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertEqual(len(json.loads(response.content)), 1)
+
+    def test_admin_read_one_service(self):
+        """
+        Read a given service
+        """
+        self.client.login(username='admin@mail.org', password='testing')
+        response = self.client.get('/xos/services/%s/' % self.service1.id, format='json')
+        parsed = json.loads(response.content)
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        self.assertEqual(parsed['name'], self.service1.name)
+
+    def test_admin_update_service(self):
+        """
+        Update a given service
+        """
+        data = model_to_dict(self.service1)
+        data['name'] = "newName"
+        json_data = json.dumps(data)
+
+        self.client.login(username='admin@mail.org', password='testing')
+        response = self.client.put('/xos/services/%s/' % self.service1.id, json_data, format='json', content_type="application/json")
+        parsed = json.loads(response.content)
+        self.assertEqual(response.status_code, status.HTTP_200_OK)
+        model = Service.objects.get(id=self.service1.id)
+        self.assertEqual(model.name, data['name'])
+        
\ No newline at end of file
diff --git a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/gulpfile.js b/xos/core/xoslib/ngXosLib/generator-xos/app/templates/gulpfile.js
deleted file mode 100644
index f114774..0000000
--- a/xos/core/xoslib/ngXosLib/generator-xos/app/templates/gulpfile.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict';
-
-var gulp = require('gulp');
-var wrench = require('wrench');
-
-var options = {
-  src: 'src/',
-  scripts: 'src/js/',
-  tmp: 'src/.tmp',
-  dist: 'dist/',
-  api: '../../ngXosLib/api/',
-  helpers: '../../ngXosLib/xosHelpers/src/',
-  static: '../../static/', // this is the django static folder
-  dashboards: '../../dashboards/' // this is the django html folder
-};
-
-wrench.readdirSyncRecursive('./gulp')
-.map(function(file) {
-  require('./gulp/' + file)(options);
-});
-
-gulp.task('default', function () {
-  gulp.start('build');
-});
diff --git a/xos/core/xoslib/ngXosViews/contentProvider/gulpfile.js b/xos/core/xoslib/ngXosViews/contentProvider/gulpfile.js
deleted file mode 100644
index f114774..0000000
--- a/xos/core/xoslib/ngXosViews/contentProvider/gulpfile.js
+++ /dev/null
@@ -1,24 +0,0 @@
-'use strict';
-
-var gulp = require('gulp');
-var wrench = require('wrench');
-
-var options = {
-  src: 'src/',
-  scripts: 'src/js/',
-  tmp: 'src/.tmp',
-  dist: 'dist/',
-  api: '../../ngXosLib/api/',
-  helpers: '../../ngXosLib/xosHelpers/src/',
-  static: '../../static/', // this is the django static folder
-  dashboards: '../../dashboards/' // this is the django html folder
-};
-
-wrench.readdirSyncRecursive('./gulp')
-.map(function(file) {
-  require('./gulp/' + file)(options);
-});
-
-gulp.task('default', function () {
-  gulp.start('build');
-});
diff --git a/xos/manage.py b/xos/manage.py
index ae4f598..219d0e7 100644
--- a/xos/manage.py
+++ b/xos/manage.py
@@ -3,6 +3,7 @@
 import sys
 
 if __name__ == "__main__":
+    os.chdir('..')  # <<<---This is what you want to add
     os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
 
     from django.core.management import execute_from_command_line
diff --git a/xos/services/cord/templates/vbngadmin.html b/xos/services/cord/templates/vbngadmin.html
index 721f76c..cceaee0 100644
--- a/xos/services/cord/templates/vbngadmin.html
+++ b/xos/services/cord/templates/vbngadmin.html
@@ -1,6 +1,6 @@
-<div class = "left-nav">
-<ul>
-<li><a href="/admin/cord/vbngtenant/">vBNG Tenants</a></li>
-</ul>
+<div class = "row text-center">
+    <div class="col-xs-12">
+        <a class="btn btn-primary" href="/admin/cord/vbngtenant/">vBNG Tenants</a>
+    </div>
 </div>
 
diff --git a/xos/services/cord/templates/vcpeadmin.html b/xos/services/cord/templates/vcpeadmin.html
index 7a5d43f..a21dabe 100644
--- a/xos/services/cord/templates/vcpeadmin.html
+++ b/xos/services/cord/templates/vcpeadmin.html
@@ -1,7 +1,9 @@
-<div class = "left-nav">
-<ul>
-<li><a href="/admin/cord/vcpetenant/">vCPE Tenants</a></li>
-<li><a href="/admin/dashboard/cord/">Subscriber View</a></li>
-</ul>
+<div class = "row text-center">
+    <div class="col-xs-6">
+        <a class="btn btn-primary" href="/admin/cord/vcpetenant/">vCPE Tenants</a>
+    </div>
+    <div class="col-xs-6">
+        <a class="btn btn-primary" href="/admin/dashboard/cord/">Subscriber View</a>
+    </div>
 </div>
 
diff --git a/xos/services/cord/templates/voltadmin.html b/xos/services/cord/templates/voltadmin.html
index 5bf28ff..e6887c5 100644
--- a/xos/services/cord/templates/voltadmin.html
+++ b/xos/services/cord/templates/voltadmin.html
@@ -1,6 +1,6 @@
-<div class = "left-nav">
-<ul>
-<li><a href="/admin/cord/volttenant/">vOLT Tenants</a></li>
-</ul>
+<div class = "row text-center">
+    <div class="col-xs-12">
+        <a href="/admin/cord/volttenant/">vOLT Tenants</a>
+    </div>
 </div>
 
diff --git a/xos/synchronizers/base/ansible.py b/xos/synchronizers/base/ansible.py
index 9846c9f..7c30685 100644
--- a/xos/synchronizers/base/ansible.py
+++ b/xos/synchronizers/base/ansible.py
@@ -16,7 +16,7 @@
     step_dir = Config().observer_steps_dir
     sys_dir = Config().observer_sys_dir
 except:
-    step_dir = XOS_DIR + '/observer/steps'
+    step_dir = XOS_DIR + '/synchronizers/openstack/steps'
     sys_dir = '/opt/opencloud'
 
 os_template_loader = jinja2.FileSystemLoader( searchpath=step_dir)
diff --git a/xos/synchronizers/base/event_loop.py b/xos/synchronizers/base/event_loop.py
index d1ef6da..6cfc9f6 100644
--- a/xos/synchronizers/base/event_loop.py
+++ b/xos/synchronizers/base/event_loop.py
@@ -26,7 +26,7 @@
 from syncstep import SyncStep
 from toposort import toposort
 from synchronizers.base.error_mapper import *
-from openstack_observer.openstacksyncstep import OpenStackSyncStep
+from synchronizers.openstack.openstacksyncstep import OpenStackSyncStep
 from synchronizers.base.steps.sync_object import SyncObject
 
 # Load app models
@@ -121,7 +121,7 @@
 			if hasattr(Config(), "observer_steps_dir"):
 				step_dir = Config().observer_steps_dir
 			else:
-				step_dir = XOS_DIR + "/observer/steps"
+				step_dir = XOS_DIR + "/synchronizers/openstack/steps"
 
 		for fn in os.listdir(step_dir):
 			pathname = os.path.join(step_dir,fn)
diff --git a/xos/synchronizers/base/steps/sync_container.py b/xos/synchronizers/base/steps/sync_container.py
index 3db5a52..d647aef 100644
--- a/xos/synchronizers/base/steps/sync_container.py
+++ b/xos/synchronizers/base/steps/sync_container.py
@@ -6,7 +6,7 @@
 import time
 from django.db.models import F, Q
 from xos.config import Config
-from observers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
+from synchronizers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
 from synchronizers.base.syncstep import SyncStep, DeferredException
 from synchronizers.base.ansible import run_template_ssh
 from core.models import Service, Slice, Instance
diff --git a/xos/synchronizers/base/steps/sync_controller_sites.py b/xos/synchronizers/base/steps/sync_controller_sites.py
index bb9a566..1b3c2ba 100644
--- a/xos/synchronizers/base/steps/sync_controller_sites.py
+++ b/xos/synchronizers/base/steps/sync_controller_sites.py
@@ -2,7 +2,7 @@
 import base64
 from django.db.models import F, Q
 from xos.config import Config
-from openstack_observer.openstacksyncstep import OpenStackSyncStep
+from synchronizers.openstack.openstacksyncstep import OpenStackSyncStep
 from core.models.site import *
 from synchronizers.base.syncstep import *
 from synchronizers.base.ansible import *
diff --git a/xos/synchronizers/base/xos-synchronizer.py b/xos/synchronizers/base/xos-synchronizer.py
new file mode 100644
index 0000000..3fffd33
--- /dev/null
+++ b/xos/synchronizers/base/xos-synchronizer.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+import os
+import argparse
+import sys
+
+sys.path.append('/opt/xos')
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
+from synchronizers.base.backend import Backend
+from xos.config import Config, DEFAULT_CONFIG_FN
+from core.models import Instance
+from xos.logger import Logger, logging, logger
+from django.db import ProgrammingError
+import time
+
+try:
+    from django import setup as django_setup # django 1.7
+except:
+    django_setup = False
+
+config = Config()
+
+# after http://www.erlenstar.demon.co.uk/unix/faq_2.html
+def daemon():
+    """Daemonize the current process."""
+    if os.fork() != 0: os._exit(0)
+    os.setsid()
+    if os.fork() != 0: os._exit(0)
+    os.umask(0)
+    devnull = os.open(os.devnull, os.O_RDWR)
+    os.dup2(devnull, 0)
+    # xxx fixme - this is just to make sure that nothing gets stupidly lost - should use devnull
+    logdir=os.path.dirname(config.observer_logfile)
+    # when installed in standalone we might not have httpd installed
+    if not os.path.isdir(logdir): os.mkdir(logdir)
+    crashlog = os.open('%s'%config.observer_logfile, os.O_RDWR | os.O_APPEND | os.O_CREAT, 0644)
+    os.dup2(crashlog, 1)
+    os.dup2(crashlog, 2)
+
+    if hasattr(config, "observer_pidfile"):
+        pidfile = config.get("observer_pidfile")
+    else:
+        pidfile = "/var/run/xosobserver.pid"
+    try:
+        file(pidfile,"w").write(str(os.getpid()))
+    except:
+        print "failed to create pidfile %s" % pidfile
+
+def main():
+    # Generate command line parser
+    parser = argparse.ArgumentParser(usage='%(prog)s [options]')
+    parser.add_argument('-d', '--daemon', dest='daemon', action='store_true', default=False,
+                        help='Run as daemon.')
+    # smbaker: util/config.py parses sys.argv[] directly to get config file name; include the option here to avoid
+    #   throwing unrecognized argument exceptions
+    parser.add_argument('-C', '--config', dest='config_file', action='store', default=DEFAULT_CONFIG_FN,
+                        help='Name of config file.')
+    args = parser.parse_args()
+
+    if args.daemon: daemon()
+
+    if django_setup: # 1.7
+        django_setup()
+
+    models_active = False
+    wait = False
+    while not models_active:
+        try:
+            _ = Instance.objects.first()
+            models_active = True
+        except ProgrammingError:
+            logger.info('Waiting for data model to come up before starting...')
+            wait = True
+
+    if (wait):
+        time.sleep(60) # Safety factor, seeing that we stumbled waiting for the data model to come up.
+    backend = Backend()
+    backend.run()    
+
+if __name__ == '__main__':
+    
+    main() 
diff --git a/xos/synchronizers/helloworld/helloworld-observer.py b/xos/synchronizers/helloworld/helloworld-synchronizer.py
similarity index 70%
rename from xos/synchronizers/helloworld/helloworld-observer.py
rename to xos/synchronizers/helloworld/helloworld-synchronizer.py
index d6a71ff..84bec4f 100755
--- a/xos/synchronizers/helloworld/helloworld-observer.py
+++ b/xos/synchronizers/helloworld/helloworld-synchronizer.py
@@ -5,7 +5,7 @@
 import importlib
 import os
 import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../..")
+observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../../synchronizers/base")
 sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
+mod = importlib.import_module("xos-synchronizer")
 mod.main()
diff --git a/xos/synchronizers/helloworld/helloworld_config b/xos/synchronizers/helloworld/helloworld_config
index e32ee0c..1f67242 100644
--- a/xos/synchronizers/helloworld/helloworld_config
+++ b/xos/synchronizers/helloworld/helloworld_config
@@ -37,7 +37,7 @@
 images_directory=/opt/xos/images
 dependency_graph=/opt/xos/model-deps
 logfile=/var/log/xos_backend.log
-steps_dir=/opt/xos/observers/helloworld/steps
+steps_dir=/opt/xos/synchronizers/helloworld/steps
 applist=helloworld
 
 [gui]
diff --git a/xos/synchronizers/helloworldservice_complete/helloworldservice-observer.py b/xos/synchronizers/helloworldservice_complete/helloworldservice-synchronizer.py
similarity index 67%
rename from xos/synchronizers/helloworldservice_complete/helloworldservice-observer.py
rename to xos/synchronizers/helloworldservice_complete/helloworldservice-synchronizer.py
index 75dcc46..95f4081 100755
--- a/xos/synchronizers/helloworldservice_complete/helloworldservice-observer.py
+++ b/xos/synchronizers/helloworldservice_complete/helloworldservice-synchronizer.py
@@ -7,7 +7,7 @@
 import os
 import sys
 observer_path = os.path.join(os.path.dirname(
-    os.path.realpath(__file__)), "../..")
+    os.path.realpath(__file__)), "../../synchronizers/base")
 sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
+mod = importlib.import_module("xos-synchronizer")
 mod.main()
diff --git a/xos/synchronizers/helloworldservice_complete/helloworldservice_config b/xos/synchronizers/helloworldservice_complete/helloworldservice_config
index 716e3a0..b779d0e 100644
--- a/xos/synchronizers/helloworldservice_complete/helloworldservice_config
+++ b/xos/synchronizers/helloworldservice_complete/helloworldservice_config
@@ -17,7 +17,7 @@
 # This is the location to the dependency graph you generate
 dependency_graph=/opt/xos/observers/helloworldservice_complete/model-deps
 # The location of your SyncSteps
-steps_dir=/opt/xos/observers/helloworldservice_complete/steps
+steps_dir=/opt/xos/synchronizers/helloworldservice_complete/steps
 # A temporary directory that will be used by ansible
 sys_dir=/opt/xos/observers/helloworldservice_complete/sys
 # Location of the file to save logging messages to the backend log is often used
diff --git a/xos/synchronizers/helloworldservice_complete/steps/sync_helloworldtenant.py b/xos/synchronizers/helloworldservice_complete/steps/sync_helloworldtenant.py
index 5604296..b7ed2a8 100644
--- a/xos/synchronizers/helloworldservice_complete/steps/sync_helloworldtenant.py
+++ b/xos/synchronizers/helloworldservice_complete/steps/sync_helloworldtenant.py
@@ -2,7 +2,7 @@
 import sys
 from django.db.models import Q, F
 from services.helloworldservice_complete.models import HelloWorldServiceComplete, HelloWorldTenantComplete
-from observers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
+from synchronizers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
 
 parentdir = os.path.join(os.path.dirname(__file__), "..")
 sys.path.insert(0, parentdir)
diff --git a/xos/synchronizers/hpc/hpc-observer.py b/xos/synchronizers/hpc/hpc-synchronizer.py
similarity index 71%
rename from xos/synchronizers/hpc/hpc-observer.py
rename to xos/synchronizers/hpc/hpc-synchronizer.py
index d6a71ff..84bec4f 100755
--- a/xos/synchronizers/hpc/hpc-observer.py
+++ b/xos/synchronizers/hpc/hpc-synchronizer.py
@@ -5,7 +5,7 @@
 import importlib
 import os
 import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../..")
+observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../../synchronizers/base")
 sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
+mod = importlib.import_module("xos-synchronizer")
 mod.main()
diff --git a/xos/synchronizers/hpc/hpc_observer_config b/xos/synchronizers/hpc/hpc_synchronizer_config
similarity index 74%
rename from xos/synchronizers/hpc/hpc_observer_config
rename to xos/synchronizers/hpc/hpc_synchronizer_config
index 326e731..9d4e70a 100644
--- a/xos/synchronizers/hpc/hpc_observer_config
+++ b/xos/synchronizers/hpc/hpc_synchronizer_config
@@ -23,9 +23,9 @@
 
 [observer]
 name=hpc
-dependency_graph=/opt/xos/observers/hpc/model-deps
-steps_dir=/opt/xos/observers/hpc/steps
-deleters_dir=/opt/xos/observers/hpc/deleters
+dependency_graph=/opt/xos/synchronizers/hpc/model-deps
+steps_dir=/opt/xos/synchronizers/hpc/steps
+deleters_dir=/opt/xos/synchronizers/hpc/deleters
 log_file=console
 #/var/log/hpc.log
 driver=None
diff --git a/xos/synchronizers/model_policy.py b/xos/synchronizers/model_policy.py
index 6cc2176..b8fdd5d 100644
--- a/xos/synchronizers/model_policy.py
+++ b/xos/synchronizers/model_policy.py
@@ -1,7 +1,7 @@
 from django.db.models.signals import post_save
 from django.dispatch import receiver
 import pdb
-from generator.dependency_walker import *
+from generate.dependency_walker import *
 from synchronizers.openstack import model_policies
 from xos.logger import logger
 from datetime import datetime
diff --git a/xos/synchronizers/monitoring_channel/monitoring_channel_observer.py b/xos/synchronizers/monitoring_channel/monitoring_channel_observer.py
deleted file mode 100755
index d6a71ff..0000000
--- a/xos/synchronizers/monitoring_channel/monitoring_channel_observer.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env python
-
-# This imports and runs ../../xos-observer.py
-
-import importlib
-import os
-import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../..")
-sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
-mod.main()
diff --git a/xos/synchronizers/helloworld/helloworld-observer.py b/xos/synchronizers/monitoring_channel/monitoring_channel_synchronizer.py
similarity index 70%
copy from xos/synchronizers/helloworld/helloworld-observer.py
copy to xos/synchronizers/monitoring_channel/monitoring_channel_synchronizer.py
index d6a71ff..84bec4f 100755
--- a/xos/synchronizers/helloworld/helloworld-observer.py
+++ b/xos/synchronizers/monitoring_channel/monitoring_channel_synchronizer.py
@@ -5,7 +5,7 @@
 import importlib
 import os
 import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../..")
+observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../../synchronizers/base")
 sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
+mod = importlib.import_module("xos-synchronizer")
 mod.main()
diff --git a/xos/synchronizers/monitoring_channel/monitoring_channel_observer_config b/xos/synchronizers/monitoring_channel/monitoring_channel_synchronizer_config
similarity index 68%
rename from xos/synchronizers/monitoring_channel/monitoring_channel_observer_config
rename to xos/synchronizers/monitoring_channel/monitoring_channel_synchronizer_config
index 5657e1d..8c6578f 100644
--- a/xos/synchronizers/monitoring_channel/monitoring_channel_observer_config
+++ b/xos/synchronizers/monitoring_channel/monitoring_channel_synchronizer_config
@@ -23,10 +23,10 @@
 
 [observer]
 name=monitoring_channel
-dependency_graph=/opt/xos/observers/monitoring_channel/model-deps
-steps_dir=/opt/xos/observers/monitoring_channel/steps
-sys_dir=/opt/xos/observers/monitoring_channel/sys
-deleters_dir=/opt/xos/observers/monitoring_channel/deleters
+dependency_graph=/opt/xos/synchronizers/monitoring_channel/model-deps
+steps_dir=/opt/xos/synchronizers/monitoring_channel/steps
+sys_dir=/opt/xos/synchronizers/monitoring_channel/sys
+deleters_dir=/opt/xos/synchronizers/monitoring_channel/deleters
 log_file=console
 driver=None
 pretend=False
diff --git a/xos/synchronizers/monitoring_channel/steps/sync_monitoringchannel.py b/xos/synchronizers/monitoring_channel/steps/sync_monitoringchannel.py
index 2b93c48..2e4eca8 100644
--- a/xos/synchronizers/monitoring_channel/steps/sync_monitoringchannel.py
+++ b/xos/synchronizers/monitoring_channel/steps/sync_monitoringchannel.py
@@ -8,7 +8,7 @@
 from xos.config import Config
 from synchronizers.base.syncstep import SyncStep
 from synchronizers.base.ansible import run_template_ssh
-from observers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
+from synchronizers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
 from core.models import Service, Slice
 from services.ceilometer.models import MonitoringChannel
 from xos.logger import Logger, logging
diff --git a/xos/synchronizers/onos/onos-observer.py b/xos/synchronizers/onos/onos-observer.py
deleted file mode 100755
index d6a71ff..0000000
--- a/xos/synchronizers/onos/onos-observer.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env python
-
-# This imports and runs ../../xos-observer.py
-
-import importlib
-import os
-import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../..")
-sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
-mod.main()
diff --git a/xos/synchronizers/helloworld/helloworld-observer.py b/xos/synchronizers/onos/onos-synchronizer.py
similarity index 70%
copy from xos/synchronizers/helloworld/helloworld-observer.py
copy to xos/synchronizers/onos/onos-synchronizer.py
index d6a71ff..84bec4f 100755
--- a/xos/synchronizers/helloworld/helloworld-observer.py
+++ b/xos/synchronizers/onos/onos-synchronizer.py
@@ -5,7 +5,7 @@
 import importlib
 import os
 import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../..")
+observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../../synchronizers/base")
 sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
+mod = importlib.import_module("xos-synchronizer")
 mod.main()
diff --git a/xos/synchronizers/onos/onos_observer_config b/xos/synchronizers/onos/onos_synchronizer_config
similarity index 72%
rename from xos/synchronizers/onos/onos_observer_config
rename to xos/synchronizers/onos/onos_synchronizer_config
index 3c6d63d..c6ceece 100644
--- a/xos/synchronizers/onos/onos_observer_config
+++ b/xos/synchronizers/onos/onos_synchronizer_config
@@ -23,10 +23,10 @@
 
 [observer]
 name=onos
-dependency_graph=/opt/xos/observers/onos/model-deps
-steps_dir=/opt/xos/observers/onos/steps
-sys_dir=/opt/xos/observers/onos/sys
-deleters_dir=/opt/xos/observers/onos/deleters
+dependency_graph=/opt/xos/synchronizers/onos/model-deps
+steps_dir=/opt/xos/synchronizers/onos/steps
+sys_dir=/opt/xos/synchronizers/onos/sys
+deleters_dir=/opt/xos/synchronizers/onos/deleters
 log_file=console
 driver=None
 pretend=False
diff --git a/xos/synchronizers/onos/steps/sync_onosapp.py b/xos/synchronizers/onos/steps/sync_onosapp.py
index 6b26461..91eec44 100644
--- a/xos/synchronizers/onos/steps/sync_onosapp.py
+++ b/xos/synchronizers/onos/steps/sync_onosapp.py
@@ -9,7 +9,7 @@
 from xos.config import Config
 from synchronizers.base.syncstep import SyncStep
 from synchronizers.base.ansible import run_template_ssh
-from observers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
+from synchronizers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
 from core.models import Service, Slice
 from services.onos.models import ONOSService, ONOSApp
 from xos.logger import Logger, logging
diff --git a/xos/synchronizers/onos/steps/sync_onosservice.py b/xos/synchronizers/onos/steps/sync_onosservice.py
index 2236fb5..0474dc6 100644
--- a/xos/synchronizers/onos/steps/sync_onosservice.py
+++ b/xos/synchronizers/onos/steps/sync_onosservice.py
@@ -8,7 +8,7 @@
 from xos.config import Config
 from synchronizers.base.syncstep import SyncStep
 from synchronizers.base.ansible import run_template_ssh
-from observers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
+from synchronizers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
 from core.models import Service, Slice
 from services.onos.models import ONOSService, ONOSApp
 from xos.logger import Logger, logging
diff --git a/xos/synchronizers/openstack/ansible.py b/xos/synchronizers/openstack/ansible.py
deleted file mode 100644
index 9846c9f..0000000
--- a/xos/synchronizers/openstack/ansible.py
+++ /dev/null
@@ -1,211 +0,0 @@
-#!/usr/bin/env python
-import jinja2
-import tempfile
-import os
-import json
-import pdb
-import string
-import random
-import re
-import traceback
-import subprocess
-from xos.config import Config, XOS_DIR
-from xos.logger import observer_logger
-
-try:
-    step_dir = Config().observer_steps_dir
-    sys_dir = Config().observer_sys_dir
-except:
-    step_dir = XOS_DIR + '/observer/steps'
-    sys_dir = '/opt/opencloud'
-
-os_template_loader = jinja2.FileSystemLoader( searchpath=step_dir)
-os_template_env = jinja2.Environment(loader=os_template_loader)
-
-def parse_output(msg):
-    lines = msg.splitlines()
-    results = []
-
-    observer_logger.info(msg)
-
-    for l in lines:
-        magic_str = 'ok: [127.0.0.1] => '
-        magic_str2 = 'changed: [127.0.0.1] => '
-        if (l.startswith(magic_str)):
-            w = len(magic_str)
-            str = l[w:]
-            d = json.loads(str)
-            results.append(d)
-        elif (l.startswith(magic_str2)):
-            w = len(magic_str2)
-            str = l[w:]
-            d = json.loads(str)
-            results.append(d)
-
-
-    return results
-
-def parse_unreachable(msg):
-    total_unreachable=0
-    total_failed=0
-    for l in msg.splitlines():
-        x = re.findall('ok=([0-9]+).*changed=([0-9]+).*unreachable=([0-9]+).*failed=([0-9]+)', l)
-        if x:
-            (ok, changed, unreachable, failed) = x[0]
-            ok=int(ok)
-            changed=int(changed)
-            unreachable=int(unreachable)
-            failed=int(failed)
-
-            total_unreachable += unreachable
-            total_failed += failed
-    return {'unreachable':total_unreachable,'failed':total_failed}
-	
-
-def id_generator(size=6, chars=string.ascii_uppercase + string.digits):
-    return ''.join(random.choice(chars) for _ in range(size))
-
-def shellquote(s):
-    return "'" + s.replace("'", "'\\''") + "'"
-
-def get_playbook_fn(opts, path):
-    if not opts.get("ansible_tag", None):
-        # if no ansible_tag is in the options, then generate a unique one
-        objname= id_generator()
-        opts = opts.copy()
-        opts["ansible_tag"] = objname
-
-    objname = opts["ansible_tag"]
-
-    os.system('mkdir -p %s' % os.path.join(sys_dir, path))
-    return (opts, os.path.join(sys_dir,path,objname))
-
-def run_template(name, opts, path='', expected_num=None, ansible_config=None, ansible_hosts=None, run_ansible_script=None):
-    template = os_template_env.get_template(name)
-    buffer = template.render(opts)
-
-    (opts, fqp) = get_playbook_fn(opts, path)
-
-    f = open(fqp,'w')
-    f.write(buffer)
-    f.flush()
-
-    # This is messy -- there's no way to specify ansible config file from
-    # the command line, but we can specify it using the environment.
-    env = os.environ.copy()
-    if ansible_config:
-       env["ANSIBLE_CONFIG"] = ansible_config
-    if ansible_hosts:
-       env["ANSIBLE_HOSTS"] = ansible_hosts
-
-    if (not Config().observer_pretend):
-        if not run_ansible_script:
-            run_ansible_script = os.path.join(XOS_DIR, "synchronizers/base/run_ansible")
-
-        process = subprocess.Popen("%s %s" % (run_ansible_script, shellquote(fqp)), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env)
-        msg = process.stdout.read()
-        err_msg = process.stderr.read()
-
-        if getattr(Config(), "observer_save_ansible_output", False):
-            try:
-                open(fqp+".out","w").write(msg)
-                open(fqp+".err","w").write(err_msg)
-            except:
-                # fail silently
-                pass
-
-    else:
-        msg = open(fqp+'.out').read()
-
-    try:
-        ok_results = parse_output(msg)
-        if (expected_num is not None) and (len(ok_results) != expected_num):
-            raise ValueError('Unexpected num %s!=%d' % (str(expected_num), len(ok_results)) )
-
-        parsed = parse_unreachable(msg)
-        total_unreachable = parsed['unreachable']
-	failed = parsed['failed']
-	if (failed):
-		raise ValueError('Ansible playbook failed.')
-
-        if (total_unreachable > 0):
-            raise ValueError("Unreachable results in ansible recipe")
-    except ValueError,e:
-        all_fatal = [e.message] + re.findall(r'^msg: (.*)',msg,re.MULTILINE)
-        all_fatal2 = re.findall(r'^ERROR: (.*)',msg,re.MULTILINE)
-
-        all_fatal.extend(all_fatal2)
-        try:
-            error = ' // '.join(all_fatal)
-        except:
-            pass
-        raise Exception(error)
-
-    return ok_results
-
-def run_template_ssh(name, opts, path='', expected_num=None):
-    instance_name = opts["instance_name"]
-    hostname = opts["hostname"]
-    private_key = opts["private_key"]
-    baremetal_ssh = opts.get("baremetal_ssh",False)
-    if baremetal_ssh:
-        # no instance_id or nat_ip for baremetal
-        # we never proxy to baremetal
-        proxy_ssh = False
-    else:
-        instance_id = opts["instance_id"]
-        nat_ip = opts["nat_ip"]
-        try:
-            proxy_ssh = Config().observer_proxy_ssh
-        except:
-            proxy_ssh = True
-
-    (opts, fqp) = get_playbook_fn(opts, path)
-    private_key_pathname = fqp + ".key"
-    config_pathname = fqp + ".config"
-    hosts_pathname = fqp + ".hosts"
-
-    f = open(private_key_pathname, "w")
-    f.write(private_key)
-    f.close()
-
-    f = open(config_pathname, "w")
-    f.write("[ssh_connection]\n")
-    if proxy_ssh:
-        proxy_command = "ProxyCommand ssh -q -i %s -o StrictHostKeyChecking=no %s@%s" % (private_key_pathname, instance_id, hostname)
-        f.write('ssh_args = -o "%s"\n' % proxy_command)
-    f.write('scp_if_ssh = True\n')
-    f.write('pipelining = True\n')
-    f.write('\n[defaults]\n')
-    f.write('host_key_checking = False\n')
-    f.close()
-
-    f = open(hosts_pathname, "w")
-    f.write("[%s]\n" % instance_name)
-    if proxy_ssh or baremetal_ssh:
-        f.write("%s ansible_ssh_private_key_file=%s\n" % (hostname, private_key_pathname))
-    else:
-        # acb: Login user is hardcoded, this is not great
-        f.write("%s ansible_ssh_private_key_file=%s ansible_ssh_user=ubuntu\n" % (nat_ip, private_key_pathname))
-    f.close()
-
-    # SSH will complain if private key is world or group readable
-    os.chmod(private_key_pathname, 0600)
-
-    print "ANSIBLE_CONFIG=%s" % config_pathname
-    print "ANSIBLE_HOSTS=%s" % hosts_pathname
-
-    return run_template(name, opts, path, ansible_config = config_pathname, ansible_hosts = hosts_pathname, run_ansible_script="/opt/xos/observer/run_ansible_verbose")
-
-
-
-def main():
-    run_template('ansible/sync_user_deployments.yaml',{ "endpoint" : "http://172.31.38.128:5000/v2.0/",
-             "name" : "Sapan Bhatia",
-             "email": "gwsapan@gmail.com",
-             "password": "foobar",
-             "admin_user":"admin",
-             "admin_password":"6a789bf69dd647e2",
-             "admin_tenant":"admin",
-             "tenant":"demo",
-             "roles":['user','admin'] })
diff --git a/xos/synchronizers/openstack/ansible.py b/xos/synchronizers/openstack/ansible.py
new file mode 120000
index 0000000..c20dc8b
--- /dev/null
+++ b/xos/synchronizers/openstack/ansible.py
@@ -0,0 +1 @@
+../base/ansible.py
\ No newline at end of file
diff --git a/xos/synchronizers/openstack/event_loop.py b/xos/synchronizers/openstack/event_loop.py
index d1ef6da..6cfc9f6 100644
--- a/xos/synchronizers/openstack/event_loop.py
+++ b/xos/synchronizers/openstack/event_loop.py
@@ -26,7 +26,7 @@
 from syncstep import SyncStep
 from toposort import toposort
 from synchronizers.base.error_mapper import *
-from openstack_observer.openstacksyncstep import OpenStackSyncStep
+from synchronizers.openstack.openstacksyncstep import OpenStackSyncStep
 from synchronizers.base.steps.sync_object import SyncObject
 
 # Load app models
@@ -121,7 +121,7 @@
 			if hasattr(Config(), "observer_steps_dir"):
 				step_dir = Config().observer_steps_dir
 			else:
-				step_dir = XOS_DIR + "/observer/steps"
+				step_dir = XOS_DIR + "/synchronizers/openstack/steps"
 
 		for fn in os.listdir(step_dir):
 			pathname = os.path.join(step_dir,fn)
diff --git a/xos/synchronizers/openstack/steps/sync_container.py b/xos/synchronizers/openstack/steps/sync_container.py
index 3db5a52..d647aef 100644
--- a/xos/synchronizers/openstack/steps/sync_container.py
+++ b/xos/synchronizers/openstack/steps/sync_container.py
@@ -6,7 +6,7 @@
 import time
 from django.db.models import F, Q
 from xos.config import Config
-from observers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
+from synchronizers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
 from synchronizers.base.syncstep import SyncStep, DeferredException
 from synchronizers.base.ansible import run_template_ssh
 from core.models import Service, Slice, Instance
diff --git a/xos/synchronizers/openstack/steps/sync_controller_sites.py b/xos/synchronizers/openstack/steps/sync_controller_sites.py
index bb9a566..1b3c2ba 100644
--- a/xos/synchronizers/openstack/steps/sync_controller_sites.py
+++ b/xos/synchronizers/openstack/steps/sync_controller_sites.py
@@ -2,7 +2,7 @@
 import base64
 from django.db.models import F, Q
 from xos.config import Config
-from openstack_observer.openstacksyncstep import OpenStackSyncStep
+from synchronizers.openstack.openstacksyncstep import OpenStackSyncStep
 from core.models.site import *
 from synchronizers.base.syncstep import *
 from synchronizers.base.ansible import *
diff --git a/xos/synchronizers/openstack/xos-synchronizer.py b/xos/synchronizers/openstack/xos-synchronizer.py
index 5ca55e5..3fffd33 100644
--- a/xos/synchronizers/openstack/xos-synchronizer.py
+++ b/xos/synchronizers/openstack/xos-synchronizer.py
@@ -1,6 +1,10 @@
 #!/usr/bin/env python
 import os
 import argparse
+import sys
+
+sys.path.append('/opt/xos')
+
 os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xos.settings")
 from synchronizers.base.backend import Backend
 from xos.config import Config, DEFAULT_CONFIG_FN
diff --git a/xos/synchronizers/requestrouter/rr_observer_config b/xos/synchronizers/requestrouter/rr_synchronizer_config
similarity index 70%
rename from xos/synchronizers/requestrouter/rr_observer_config
rename to xos/synchronizers/requestrouter/rr_synchronizer_config
index ec3a1ba..179540e 100644
--- a/xos/synchronizers/requestrouter/rr_observer_config
+++ b/xos/synchronizers/requestrouter/rr_synchronizer_config
@@ -24,9 +24,9 @@
 nova_enabled=True
 
 [observer]
-dependency_graph=/opt/xos/observers/requestrouter/model-deps
-steps_dir=/opt/xos/observers/requestrouter/steps
-deleters_dir=/opt/xos/observers/requestrouter/deleters
+dependency_graph=/opt/xos/synchronizers/requestrouter/model-deps
+steps_dir=/opt/xos/synchronizers/requestrouter/steps
+deleters_dir=/opt/xos/synchronizers/requestrouter/deleters
 log_file=console
 #/var/log/hpc.log
 driver=None
diff --git a/xos/synchronizers/syndicate/syndicate_observer_config b/xos/synchronizers/syndicate/syndicate_synchronizer_config
similarity index 71%
rename from xos/synchronizers/syndicate/syndicate_observer_config
rename to xos/synchronizers/syndicate/syndicate_synchronizer_config
index 7e6d78a..7c9d2d2 100644
--- a/xos/synchronizers/syndicate/syndicate_observer_config
+++ b/xos/synchronizers/syndicate/syndicate_synchronizer_config
@@ -24,9 +24,9 @@
 nova_enabled=True
 
 [observer]
-dependency_graph=/opt/xos/observers/syndicate/model-deps
-steps_dir=/opt/xos/observers/syndicate/steps
-deleters_dir=/opt/xos/observers/syndicate/deleters
+dependency_graph=/opt/xos/synchronizers/syndicate/model-deps
+steps_dir=/opt/xos/synchronizers/syndicate/steps
+deleters_dir=/opt/xos/synchronizers/syndicate/deleters
 log_file=console
 driver=None
 
diff --git a/xos/synchronizers/vbng/vbng-observer.py b/xos/synchronizers/vbng/vbng-observer.py
deleted file mode 100755
index d6a71ff..0000000
--- a/xos/synchronizers/vbng/vbng-observer.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env python
-
-# This imports and runs ../../xos-observer.py
-
-import importlib
-import os
-import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../..")
-sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
-mod.main()
diff --git a/xos/synchronizers/helloworld/helloworld-observer.py b/xos/synchronizers/vbng/vbng-synchronizer.py
similarity index 70%
copy from xos/synchronizers/helloworld/helloworld-observer.py
copy to xos/synchronizers/vbng/vbng-synchronizer.py
index d6a71ff..84bec4f 100755
--- a/xos/synchronizers/helloworld/helloworld-observer.py
+++ b/xos/synchronizers/vbng/vbng-synchronizer.py
@@ -5,7 +5,7 @@
 import importlib
 import os
 import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../..")
+observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../../synchronizers/base")
 sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
+mod = importlib.import_module("xos-synchronizer")
 mod.main()
diff --git a/xos/synchronizers/vbng/vbng_observer_config b/xos/synchronizers/vbng/vbng_synchronizer_config
similarity index 69%
rename from xos/synchronizers/vbng/vbng_observer_config
rename to xos/synchronizers/vbng/vbng_synchronizer_config
index b75d498..d613ce3 100644
--- a/xos/synchronizers/vbng/vbng_observer_config
+++ b/xos/synchronizers/vbng/vbng_synchronizer_config
@@ -23,10 +23,10 @@
 
 [observer]
 name=vbng
-dependency_graph=/opt/xos/observers/vbng/model-deps
-steps_dir=/opt/xos/observers/vbng/steps
-sys_dir=/opt/xos/observers/vbng/sys
-deleters_dir=/opt/xos/observers/vbng/deleters
+dependency_graph=/opt/xos/synchronizers/vbng/model-deps
+steps_dir=/opt/xos/synchronizers/vbng/steps
+sys_dir=/opt/xos/synchronizers/vbng/sys
+deleters_dir=/opt/xos/synchronizers/vbng/deleters
 log_file=console
 #/var/log/hpc.log
 driver=None
diff --git a/xos/synchronizers/vcpe/steps/sync_vcpetenant.py b/xos/synchronizers/vcpe/steps/sync_vcpetenant.py
index ed5433b..691671a 100644
--- a/xos/synchronizers/vcpe/steps/sync_vcpetenant.py
+++ b/xos/synchronizers/vcpe/steps/sync_vcpetenant.py
@@ -8,7 +8,7 @@
 from xos.config import Config
 from synchronizers.base.syncstep import SyncStep
 from synchronizers.base.ansible import run_template_ssh
-from observers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
+from synchronizers.base.SyncInstanceUsingAnsible import SyncInstanceUsingAnsible
 from core.models import Service, Slice
 from services.cord.models import VCPEService, VCPETenant, VOLTTenant
 from services.hpc.models import HpcService, CDNPrefix
diff --git a/xos/synchronizers/vcpe/vcpe-observer.py b/xos/synchronizers/vcpe/vcpe-observer.py
deleted file mode 100755
index d6a71ff..0000000
--- a/xos/synchronizers/vcpe/vcpe-observer.py
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/usr/bin/env python
-
-# This imports and runs ../../xos-observer.py
-
-import importlib
-import os
-import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../..")
-sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
-mod.main()
diff --git a/xos/synchronizers/helloworld/helloworld-observer.py b/xos/synchronizers/vcpe/vcpe-synchronizer.py
similarity index 70%
copy from xos/synchronizers/helloworld/helloworld-observer.py
copy to xos/synchronizers/vcpe/vcpe-synchronizer.py
index d6a71ff..84bec4f 100755
--- a/xos/synchronizers/helloworld/helloworld-observer.py
+++ b/xos/synchronizers/vcpe/vcpe-synchronizer.py
@@ -5,7 +5,7 @@
 import importlib
 import os
 import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../..")
+observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../../synchronizers/base")
 sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
+mod = importlib.import_module("xos-synchronizer")
 mod.main()
diff --git a/xos/synchronizers/vcpe/vcpe_observer_config b/xos/synchronizers/vcpe/vcpe_synchronizer_config
similarity index 73%
rename from xos/synchronizers/vcpe/vcpe_observer_config
rename to xos/synchronizers/vcpe/vcpe_synchronizer_config
index d2c9239..110b8e2 100644
--- a/xos/synchronizers/vcpe/vcpe_observer_config
+++ b/xos/synchronizers/vcpe/vcpe_synchronizer_config
@@ -23,10 +23,10 @@
 
 [observer]
 name=vcpe
-dependency_graph=/opt/xos/observers/vcpe/model-deps
-steps_dir=/opt/xos/observers/vcpe/steps
-sys_dir=/opt/xos/observers/vcpe/sys
-deleters_dir=/opt/xos/observers/vcpe/deleters
+dependency_graph=/opt/xos/synchronizers/vcpe/model-deps
+steps_dir=/opt/xos/synchronizers/vcpe/steps
+sys_dir=/opt/xos/synchronizers/vcpe/sys
+deleters_dir=/opt/xos/synchronizers/vcpe/deleters
 log_file=console
 #/var/log/hpc.log
 driver=None
diff --git a/xos/synchronizers/vtn/vtn-observer.py b/xos/synchronizers/vtn/vtn-synchronizer.py
similarity index 71%
rename from xos/synchronizers/vtn/vtn-observer.py
rename to xos/synchronizers/vtn/vtn-synchronizer.py
index d6a71ff..84bec4f 100755
--- a/xos/synchronizers/vtn/vtn-observer.py
+++ b/xos/synchronizers/vtn/vtn-synchronizer.py
@@ -5,7 +5,7 @@
 import importlib
 import os
 import sys
-observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../..")
+observer_path = os.path.join(os.path.dirname(os.path.realpath(__file__)),"../../synchronizers/base")
 sys.path.append(observer_path)
-mod = importlib.import_module("xos-observer")
+mod = importlib.import_module("xos-synchronizer")
 mod.main()
diff --git a/xos/synchronizers/vtn/vtn_observer_config b/xos/synchronizers/vtn/vtn_synchronizer_config
similarity index 70%
rename from xos/synchronizers/vtn/vtn_observer_config
rename to xos/synchronizers/vtn/vtn_synchronizer_config
index 19e9a39..302a096 100644
--- a/xos/synchronizers/vtn/vtn_observer_config
+++ b/xos/synchronizers/vtn/vtn_synchronizer_config
@@ -23,10 +23,10 @@
 
 [observer]
 name=vtn
-dependency_graph=/opt/xos/observers/vtn/model-deps
-steps_dir=/opt/xos/observers/vtn/steps
-sys_dir=/opt/xos/observers/vtn/sys
-deleters_dir=/opt/xos/observers/vtn/deleters
+dependency_graph=/opt/xos/synchronizers/vtn/model-deps
+steps_dir=/opt/xos/synchronizers/vtn/steps
+sys_dir=/opt/xos/synchronizers/vtn/sys
+deleters_dir=/opt/xos/synchronizers/vtn/deleters
 log_file=console
 #/var/log/hpc.log
 driver=None
diff --git a/xos/templates/README.md b/xos/templates/README.md
new file mode 100644
index 0000000..af46be9
--- /dev/null
+++ b/xos/templates/README.md
@@ -0,0 +1,5 @@
+# DJANGO TEMPLATES
+
+These are the templates used by the Django Application to render the UI.
+
+More information are available in the [Django Documentation](https://docs.djangoproject.com/es/1.9/topics/templates/)
\ No newline at end of file
diff --git a/xos/templates/cord_admin/base.html b/xos/templates/cord_admin/base.html
deleted file mode 100644
index db5ccbf..0000000
--- a/xos/templates/cord_admin/base.html
+++ /dev/null
@@ -1,287 +0,0 @@
-{% load admin_static %}{% load suit_tags %}{% load url from future %}<!DOCTYPE html>
-<html lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
-<head>
-  <title>{% block title %}  {%if title %} {{ title }} | {% endif %} CORD {% endblock %}</title>
-  <link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% endblock %}"/>
-  <link rel="stylesheet" type="text/css" href="{% static 'suit/bootstrap/css/bootstrap.min.css' %}" media="all"/>
-  <link rel="stylesheet" type="text/css" href="{% static 'suit/css/suit.css' %}" media="all">
-  <link rel="stylesheet" type="text/css" href="{% static 'xos.css' %}" media="all">
-  <link rel="stylesheet" type="text/css" href="{% static 'cord.css' %}" media="all">
-  {% block extrastyle %}{% endblock %}
-  {% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% static "admin/css/rtl.css" %}{% endblock %}"/>{% endif %}
-  <script type="text/javascript">window.__admin_media_prefix__ = "{% filter escapejs %}{% static "admin/" %}{% endfilter %}";</script>
-  <script src="{% static 'suit/js/jquery-1.9.1.min.js' %}"></script>
-  <script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
-  <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
-  <script type="text/javascript" src="{% static 'log4javascript-1.4.6/log4javascript.js' %}"></script>
-  <script type="text/javascript" src="{% static 'uploadTextarea.js' %}"></script>
-  <script type="text/javascript" src="{% static 'observer_status.js' %}"></script>
-
-  <script type="text/javascript">var Suit = { $: $.noConflict() }; if (!$) $ = Suit.$; </script>
-  {% if 'SHOW_REQUIRED_ASTERISK'|suit_conf %}
-  <style type="text/css">.required:after { content: '*'; margin: 0 0 0 5px; position: absolute; color: #ccc;}</style>
-  {% endif %}
-  {% block extrahead %}{% endblock %}
-  {% block blockbots %}
-    <meta name="robots" content="NONE,NOARCHIVE"/>{% endblock %}
-  <link rel="shortcut icon" href="{% static 'favicon.png' %}">
-</head>
-{% load i18n %}
-
-<body class="{% if is_popup %}popup {% endif %}{% block bodyclass %}{% endblock %}">
-
-<div id="dialog-placeholder">
-<!-- This is a placeholder for dialog boxes, like the observer calendar -->
-</div>
-
-<!-- Sticky footer wrap -->
-<div id="wrap">
-
-  <!-- Container -->
-  {% block container %}
-    <div id="container">
-
-      {% block logo %}
-      <a href="{% url 'admin:index' %}"><h1 id="site-name"><img class="logo" height="70" width="259" src="{% static 'open-cloud-login-themed-light.png' %}"/></h1></a>
-      {% endblock %}
-      {% block header %}
-        {% if not is_popup %}
-          <!-- Header -->
-          <div id="header" class="header">
-            
-            <div id="branding">
-                  {% block quick-search %}
-                {% with 'SEARCH_URL'|suit_conf as search_url %}
-                  {% if search_url %}
-                    <form class="form-search nav-quick-search" autocomplete="off" action="{% if '/' in search_url %}{{ search_url }}{% else %}{% url search_url %}{% endif %}" method="GET">
-                      <i class="input-icon icon-search"></i>
-                      <input type="text" name="q" class="input-medium search-query" id="quick-search">
-                      <input type="submit" class="submit" value="">
-                    </form>
-                  {% endif %}
-                {% endwith %}
-              {% endblock %}
-            </div>
-          
-            {% block header_time %}
-            <div id="branding2">
-            <!--<div class="header-content header-content-first">
-              <div class="header-column icon">
-                <i class="icon-time"></i>
-              </div>
-              <div class="header-column">
-                <span class="date"> {% suit_date %}</span><br>
-                <span class="time" id="clock">{% suit_time %}</span>
-              </div>
-            </div>-->
-          
-            {% endblock %}
-
-            {% block header_content %}
-              <!--<div class="header-content">
-                <div class="header-column icon">
-                  <i class="icon-comment"></i>
-                </div>
-                <div class="header-column">
-                  <a href="" class="grey"><b>2</b> new messages</a>
-                </div>
-              </div>-->
-            {% endblock %}
-
-            {% if user.is_active and user.is_staff %}
-              <div id="user-tools">
-                {% trans 'Welcome,' %}
-                <a href="http://{{ request.get_host}}/admin/core/user/{{user.id}}">{{user.email}}</a>
-                <span id="observer-status"></span>
-                <span class="user-links">
-                {% block userlinks %}
-                  {% url 'django-admindocs-docroot' as docsroot %}
-                  {% if docsroot %}
-                    <a href="http://guide.xosproject.org/">{% trans 'Documentation' %}</a>
-                   <span class="separator">|</span>
-                  {% endif %}
-                  <a href="{% url 'admin:password_change' %}">{% trans 'Change password' %}</a>
-                  <span class="separator">|</span>
-                  <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>
-                  </span>
-                {% endblock %}
-              </div>
-            {% endif %}
-
-            {% block nav-global %}{% endblock %}
-
-          </div>
-           </div>
-        {% endif %}
-        <!-- END Header -->
-      {% endblock %}
-
-
-      <div class="suit-columns {{ is_popup|yesno:'one-column,two-columns' }}">
-
-        {% block content-center %}
-          <div id="suit-center" class="suit-column">
-
-            {% if not is_popup %}
-            {% block minidash %}
-            <div id=openCloudTopPage>
-            {% include "admin/newminidashboard.html" %}
-            </div>
-            {% endblock %} 
-
-              {% block breadcrumbs %}
-                <ul class="breadcrumb"> 
-                  <li><a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
-                    {% if title %}
-                      <span class="divider">&raquo;</span>
-                      </li>
-                      <li class="active">
-                      {{ title }}
-                    {% endif %}
-                    </li>
-                </ul>
-              {% endblock %}
-            {% endif %}
-
-            {% block messages %}
-              {% if messages %}
-
-                {% for message in messages %}
-                  <div class="alert alert-{% firstof message.tags 'info' %}">
-                    <button class="close" data-dismiss="alert">×</button>
-                    <strong>
-                      {% if message.tags %}{{ message.tags|capfirst }}{% else %}
-                        Message{% endif %}!</strong>
-                    {{ message }}
-                  </div>
-                {% endfor %}
-              {% endif %}
-            {% endblock messages %}
-
-            <!-- Content -->
-            <div id="content" class="{% block coltype %}colM{% endblock %} row-fluid">
-              {% block pretitle %}{% endblock %}
-              {% block content_title %}{% if title %}
-                <h2 class="content-title">{{ title }}</h2>
-              {% endif %}{% endblock %}
-              {% block content %}
-                {% block object-tools %}{% endblock %}
-                {{ content }}
-              {% endblock %}
-              {% block sidebar_content %}
-                {% block sidebar %}{% endblock %}
-              {% endblock %}
-            </div>
-            <!-- END Content -->
-          <span class="clearfix"></span>
-          </div>
-        {% endblock %}
-
-
-        {% block content-left %}
-          {% if not user.is_appuser %}
-              {% if not is_popup %}
-                <div id="suit-left" class="suit-column">
-
-
-                  {% include 'suit/menu.html' %}
-
-                </div>
-              {% endif %}
-          {% endif %}
-        {% endblock %}
-
-      </div>
-    </div>
-  {% endblock %}
-
-  {% if not is_popup %}
-  <!-- Sticky footer push -->
-  <div id="push"></div>
-  {% endif %}
-
-</div>
-
-{% block footer %}
-  {% if not is_popup %}
-  <div id="footer" class="footer">
-    <div class="content">
-      <div class="tools">
-        {% block footer_links %}
-          <a href="http://djangosuit.com/support/" target="_blank" class="icon"><i class="icon-question-sign"></i>Support</a>
-          <a href="http://djangosuit.com/pricing/" target="_blank" class="icon"><i class="icon-bookmark"></i>Licence</a>
-          <a href="http://github.com/darklow/django-suit/issues" target="_blank" class="icon"><i class="icon-comment"></i>Report a bug</a>
-        {% endblock %}
-      </div>
-
-      <div class="statusMsg" id="statusMsg">
-      <!-- this is a placeholder for xoslib views to display status messages -->
-      </div>
-
-      <!-- <div class="copyright">
-        {% block copyright %}
-          Copyright &copy; 2013 DjangoSuit.com<br>Developed by <a href="http://djangosuit.com" target="_blank">DjangoSuit.com</a>
-        {% endblock %}
-      </div> -->
-
-      <div class="branding">{% block footer_branding %}
-        CORD
-      {% endblock %}</div>
-    </div>
-  </div>
-  {% endif %}
-{% endblock %}
-
-  <script src="{% static 'suit/bootstrap/js/bootstrap.min.js' %}"></script>
-  <script src="{% static 'suit/js/suit.js' %}"></script>
-  <script type="text/javascript" src="//www.google.com/jsapi"></script>
-  <!-- src="{% static 'xos_graphs.js' %}" -->
-
-  {% block extrajs %}{% endblock %}
-<script src="http://d3js.org/d3.v3.js"></script>
-	<div class="modal fade hide" id="chartsModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
-	  <div class="modal-dialog">
-	    <div class="modal-content">
-	      <!--<div class="modal-header">
-		<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
-		<h4 class="modal-title" id="myModalLabel">OpenCloud</h4>
-	      </div>-->
-	      <div class="modal-body" style="overflow-y:hidden; overflow-x:hidden;">
-		<div class="chartContainer">
-			<div class="row">
-				<div class=" padding">
-				</div>
-			</div>
-
-			<div class="row">
-				<div class=" heading">
-					<p id="chartHeading" class="heading">OpenCloud</p>	
-				</div>
-			</div>
-			<div class="row">
-				<div class="padding"></div>
-				<div class="padding"></div>
-			</div>
-			<div class="row">
-				<div id="graph" class="graph">
-				</div>
-			</div>
-		</div>
-                <div id="graph_work" style="display:none"></div>
-	      </div>
-	      <!--<div class="modal-footer">
-		<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
-	      </div>-->
-	    </div><!-- /.modal-content -->
-	  </div><!-- /.modal-dialog -->
-	</div><!-- /.modal -->
-
-
-<script>
-
-
-
-
-</script>
-</body>
-</html>
diff --git a/xos/templates/cord_admin/base_site.html b/xos/templates/cord_admin/base_site.html
deleted file mode 100644
index 80d39fe..0000000
--- a/xos/templates/cord_admin/base_site.html
+++ /dev/null
@@ -1,57 +0,0 @@
-{% extends "admin/base.html" %}
-{% load admin_static %}
-
-{# Additional <head> content here, some extra meta tags or favicon #}
-{#{% block extrahead %}#}
-{#{% endblock %}#}
-
-
-{# Additional CSS includes #}
-{# {% block extrastyle %} #}
-{# {% endblock %} #}
-
-
-{# Additional JS files in footer, right before </body> #}
-{#{% block extrajs %}#}
-{#  <script type="text/javascript" src="{% static 'js/my_project.js' %}"></script>#}
-{#{% endblock %}#}
-
-
-{# Footer links (left side) #}
-{#{% block footer_links %}#}
-{#  <a href="/docs/" class="icon"><i class="icon-question-sign"></i>Documentation</a>#}
-{#{% endblock %}#}
-
-{# Additional header content like notifications or language switcher #}
-{#{% block header_content %}#}
-{#    {{ block.super }}#}
-{#    <div class="header-content">#}
-{#        <!-- First icon column -->#}
-{#        <div class="header-column icon">#}
-{#            <i class="icon-home"></i><br>#}
-{#            <i class="icon-cog"></i>#}
-{#        </div>#}
-{#        <div class="header-column" style="margin-right: 20px">#}
-{#            <a href="/" class="grey">Front-end</a><br>#}
-{#            <a href="" class="grey">One more link</a>#}
-{#        </div>#}
-{#        <!-- Second icon column -->#}
-{#        <div class="header-column icon">#}
-{#            <i class="icon-comment"></i>#}
-{#        </div>#}
-{#        <div class="header-column">#}
-{#            <a href="" class="grey">5 new messages</a>#}
-{#        </div>#}
-{#    </div>#}
-{#{% endblock %}#}
-
-{# Footer branding name (center) #}
-{% block footer_branding %}
-CORD
-{% endblock %}
-
-
-{# Footer copyright (right side) #}
-{% block copyright %}
-{#  Copyright &copy; 2013 Client<br>Developed by <a href="http://yoursite.com" target="_blank">YourName</a> #}
-{% endblock %}
diff --git a/xos/templates/cord_admin/dashboard_base.html b/xos/templates/cord_admin/dashboard_base.html
deleted file mode 100644
index bde87c2..0000000
--- a/xos/templates/cord_admin/dashboard_base.html
+++ /dev/null
@@ -1,92 +0,0 @@
-{% extends "admin/base.html" %}
-{% load admin_static %}
-
-{% block extrahead %}
-<link rel="stylesheet"  href="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.0/css/jquery.dataTables.css">
-<link rel="stylesheet" type="text/css" href="{% static 'suit/css/suit.css' %}" media="all">
-<link rel="stylesheet" type="text/css" href="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.0/css/jquery.dataTables_themeroller.css">
-<link rel="stylesheet" type="text/css" href="{% static 'xos.css' %}" media="all">
-<link rel="stylesheet" type="text/css" href="{% static 'cord.css' %}" media="all">
-<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
-<link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.css" />
-<script src="http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.js"></script>
-
-
-<!-- no need to include jquery here as it's already included by base.html. Including it multiple times will break mtuity statistics. -->
-<!-- src="http://code.jquery.com/jquery-1.9.1.js" -->
-
-<script src="http://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
-<script src="http://ajax.aspnetcdn.com/ajax/jquery.dataTables/1.9.4/jquery.dataTables.min.js"></script>
-<script type="text/javascript" src="{% static 'log4javascript-1.4.6/log4javascript.js' %}"></script>
-<script src="{% static 'js/Leaflet.MakiMarkers.js' %}" > </script>
-  
-<script>
-  $(function() {
-    $( "#hometabs" ).tabs({active: 0, //event: "mouseover"
-      //collapsible: true
-    });
-  });
-
-var consoleAppender = new log4javascript.BrowserConsoleAppender();
-var patternLayout = new log4javascript.PatternLayout("%d{HH:mm:ss,SSS} %l{s:l} %-5p - %m{1}%n");
-consoleAppender.setLayout(patternLayout);
-//var log  = log4javascript.getDefaultLogger();
-var log  = log4javascript.getRootLogger();
-log.addAppender(consoleAppender);
-log.setLevel(log4javascript.Level.ERROR);
-
-function confirmDialog(title,msg) {
-    var dialog = $('<div>'+msg+'</div>');
-    var def = $.Deferred();
-
-    $(dialog).dialog({
-        resizable: false,
-        title: title,
-        autoOpen: true,
-        modal: true,
-        dialogClass: "dashboard-hpc-instance",
-        buttons: {
-            'OK': function() {
-                def.resolve();
-                log.debug("Chose to add a instance");
-                $( this ).dialog( "close" );
-            },
-            'Cancel': function() {
-                def.reject();
-                $( this ).dialog( "close" );
-            }
-        },
-        close: {
-        }
-    });
-    return def.promise();
-}
-
-function errorDialog(title,msg) {
-    var dialog = $('<div>'+msg+'</div>');
-    var def = $.Deferred();
-
-    $(dialog).dialog({
-        resizable: false,
-        title: title,
-        autoOpen: true,
-        modal: true,
-        dialogClass: "dashboard-hpc-instance",
-        buttons: {
-            'OK': function() {
-                def.resolve();
-                $( this ).dialog( "close" );
-            },
-        },
-        close: {
-        }
-    });
-    return def.promise();
-}
-
-</script>
-{% endblock %}
-
-{% block content %}
-dashboard goes here
-{% endblock %}
diff --git a/xos/templates/cord_admin/login.html b/xos/templates/cord_admin/login.html
deleted file mode 100644
index a586acf..0000000
--- a/xos/templates/cord_admin/login.html
+++ /dev/null
@@ -1,161 +0,0 @@
-{% extends "admin/base_site_login.html" %}
-{% load i18n admin_static %}
-
-{% block extrastyle %}{{ block.super }}
-<link rel="stylesheet" type="text/css" href="/static/suit/bootstrap/css/bootstrap.min.css" media="all"/>
-<link rel="stylesheet" type="text/css" href="{% static "xos.css" %}" />
-<link rel="stylesheet" type="text/css" href="{% static "cord.css" %}" />
-<script src="{% static 'suit/js/jquery-1.9.1.min.js' %}"></script>
-<script src="http://code.jquery.com/ui/1.11.0/jquery-ui.js"></script>
-{% endblock %}
-
-
-{% block bodyclass %}login{% endblock %}
-
-{% block nav-global %}{% endblock %}
-
-{% block content_title %}{% endblock %}
-
-{% block breadcrumbs %}{% endblock %}
-
-{% block content %}
-{% if form.errors and not form.non_field_errors and not form.this_is_the_login_form.errors %}
-<p class="errornote">
-{% blocktrans count counter=form.errors.items|length %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
-</p>
-{% endif %}
-
-{% if form.non_field_errors or form.this_is_the_login_form.errors %}
-{% for error in form.non_field_errors %}
-<p class="errornote">
-    {{ error }}
-</p>
-{% endfor %}
-{% for error in form.this_is_the_login_form.errors %}
-<p class="errornote">
-    {{ error }}
-</p>
-{% endfor %}
-{% endif %}
-<div id="wrap">
-<div id="content-main">
-<h1><i class="icon-lock icon-white"></i> OpenCloud</h1>
-<form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %}
-  <div class="form-row">
-    {% if not form.this_is_the_login_form.errors %}{{ form.username.errors }}{% endif %}
-     {{ form.username }}
-  </div>
-  <div class="form-row">
-    {% if not form.this_is_the_login_form.errors %}{{ form.password.errors }}{% endif %}
-     {{ form.password }}
-    <input type="hidden" name="this_is_the_login_form" value="1" />
-    <input type="hidden" name="old_next" value="{{ next }}" />
-    <input type="hidden" name="next" value="/loggedin/?orig_next={{ next }}" />
-  </div>
-  <div class="submit-row">
-    <input type="submit" class="btn btn-info" value="{% trans 'SIGN IN' %}" />
-  </div>
-        <div id="requestAccountLink">{% trans 'Request a new Account' %}</div>
-</form>
-
-<div id="request-account-form" title="Request an Account" style="display: none;">
-	<form>
-		<fieldset>
-			<div class="request-form-row">
-				<label for="request-first-name">First Name</label>
-				<input type="text" name="request-first-name" id="request-first-name">
-			</div>
-			 <div class="request-form-row">
-                                <label for="request-last-name">Last Name</label>
-                                <input type="text" name="request-last-name" id="request-last-name">
-                        </div>
-			 <div class="request-form-row">
-                                <label for="request-email">Email</label>
-                                <input type="text" name="request-email" id="request-email">
-                        </div>
-			 <div class="request-form-row">
-                                <label for="request-site-name">Site</label><br>
-				<select id="request-site-name" name="request-site-name">
-                                    <option>---------</option>
-                                    {% for site in sites %}
-                                        {% if site.allowNewUsers %}
-                                            <option>{{ site.name }}</option>
-                                        {% endif %}
-                                    {% endfor %}
-				</select>
-                        </div>
-			<div class="submit-row">
-    				<input id ="request-signup" class="btn btn-info" value="SIGN UP">
-  			</div>
-		</fieldset>
-	</form>
-</div>
-</div>
-</div>
-
-
-<script type="text/javascript">
-$(function() {
-	initRequest();
-});
-function initRequest(){
-	$.ajax({
-			url: '/tenantview',
-			dataType: 'json',
-			success: function (data) {
-				var sites = data['sitesToBeRequested'];
-				console.log(sites);
-				for (site in sites){
-					$("#request-site-name").append("<option>" + site + "</option>");
-				}
-			}
-		});
-}
-$("#requestAccountLink").unbind().click(function(){
-	$("#request-account-form").dialog({
-					autoOpen: false,
-					modal: true,
-					dialogClass: "requestDialog",
-				});
-				$("#request-account-form").dialog("open");
-})
-$("#request-signup").unbind().click(function(){
-							$.ajax({
-								url: '/requestaccess/',
-								dataType: 'json',
-								data: {
-									email: $("#request-email").val(),
-									firstname: $("#request-first-name").val(),
-									lastname: $("#request-last-name").val(),
-									site: $("#request-site-name").val(),
-									csrfmiddlewaretoken: "{{ csrf_token }}", // < here 
-									state: "inactive"
-								},
-								async: false,
-								type: 'POST',
-								success: function (response) {
-                                                                    if (response && response.error) {
-                                                                        if (response.error == "already_approved") {
-                                                                            alert("Your request has already been proccessed and approved. We are sending you another email with a new temporary password");
-                                                                            return;
-                                                                        } else if (response.error == "already_pending") {
-                                                                            alert("Your request is already pending and awaiting approval");
-                                                                            return;
-                                                                        } else if (response.error == "is_deleted") {
-                                                                            alert("Your user record is in a deleted state. Please contact OpenCloud support");
-                                                                            return;
-                                                                        }
-                                                                    }
-								    $("#request-account-form").dialog("close");
-								    alert("Your request has been submitted");
-								},
-								error:function (xhr, textStatus, thrownError){
-         							   alert("Error:", textStatus + " " + xhr.responseText);
-        						        }
-							});
-})
-document.getElementById('id_username').focus()
-</script>
-</div>
-</div>
-{% endblock %}
diff --git a/xos/templates/registration/logged_out.html b/xos/templates/registration/logged_out.html
deleted file mode 100644
index 476a713..0000000
--- a/xos/templates/registration/logged_out.html
+++ /dev/null
@@ -1,12 +0,0 @@
-{% extends "admin/base_site.html" %}
-{% load i18n %}
-
-{% block breadcrumbs %}<div class="breadcrumbs"><a href="{% url 'admin:index' %}">{% trans 'Home' %}</a></div>{% endblock %}
-
-{% block content %}
-
-<p>{% trans "Thanks for spending some quality time with the Web site today." %}</p>
-
-<p><a href="{% url 'admin:loggedin' %}">{% trans 'Log in again' %}</a></p>
-
-{% endblock %}
diff --git a/xos/tools/chuckmove b/xos/tools/chuckmove
index a7e0bff..5a77876 100755
--- a/xos/tools/chuckmove
+++ b/xos/tools/chuckmove
@@ -14,6 +14,10 @@
                           action="store_false", dest="verbose",
                           help="be vewwy quiet (I'm hunting wabbits)")
 
+parser.add_option("-r", "--reuse",
+                          action="store_false", dest="reuse",
+                          help="Reuse .orig files. Dangerous!")
+
 parser.add_option("-o", "--old", 
                           metavar="old", help="Old namespace")
 
@@ -56,9 +60,11 @@
         if (n.endswith('.py')):
             full_path = '/'.join([root,n])
             orig_path = full_path + '.orig'
-            print 'Working on %s:'%full_path
-            if (not os.path.exists(orig_path)):
-                print 'Copying %s->%s:'%(full_path,orig_path)
+            if (options.verbose):
+                print 'Working on %s:'%full_path
+            if (not os.path.exists(orig_path) or not options.reuse):
+                if (options.verbose):
+                    print 'Copying %s->%s:'%(full_path,orig_path)
                 copy(full_path, orig_path)
             f_contents = open(orig_path).read()
             new_contents = []
diff --git a/xos/tools/xos-manage b/xos/tools/xos-manage
index 075870b..4783bf5 100755
--- a/xos/tools/xos-manage
+++ b/xos/tools/xos-manage
@@ -82,7 +82,7 @@
     python $XOS_DIR/manage.py syncdb --noinput
     if [[ $DJANGO_17 ]]; then
         echo "Loading initial data from fixture..."
-        python $XOS_DIR/manage.py --noobserver --nomodelpolicy loaddata $XOS_DIR/core/fixtures/initial_data.json
+        python $XOS_DIR/manage.py --noobserver --nomodelpolicy loaddata $XOS_DIR/core/fixtures/core_initial_data.json
     fi
 }
 function evolvedb {
@@ -170,8 +170,8 @@
     dumpdata
     # TODO: This is where we could run migration scripts to upgrade the
     #   dumped data to the new models.
-    mv $XOS_DIR/core/fixtures/initial_data.json $XOS_DIR/core/fixtures/initial_data.json-old
-    cp $BACKUP_DIR/dumpdata-latest.json $XOS_DIR/core/fixtures/initial_data.json
+    mv $XOS_DIR/core/fixtures/core_initial_data.json $XOS_DIR/core/fixtures/core_initial_data.json-old
+    cp $BACKUP_DIR/dumpdata-latest.json $XOS_DIR/core/fixtures/core_initial_data.json
     dropdb
     createdb
     syncdb
@@ -183,8 +183,8 @@
     fi
     stopserver
     ensure_postgres_running
-    mv $XOS_DIR/core/fixtures/initial_data.json $XOS_DIR/core/fixtures/initial_data.json-old
-    cp $BACKUP_DIR/dumpdata-latest.json $XOS_DIR/core/fixtures/initial_data.json
+    mv $XOS_DIR/core/fixtures/core_initial_data.json $XOS_DIR/core/fixtures/core_initial_data.json-old
+    cp $BACKUP_DIR/dumpdata-latest.json $XOS_DIR/core/fixtures/core_initial_data.json
     dropdb
     createdb
     syncdb
diff --git a/xos/xos/config.py b/xos/xos/config.py
index 50b04d0..8ae7816 100644
--- a/xos/xos/config.py
+++ b/xos/xos/config.py
@@ -82,6 +82,7 @@
 			try:
 				if os.path.isdir(filename):
 					config_list = list(reversed(os.listdir(filename)))
+ 					config_list.remove('README.md')
 					config_list = [os.path.join(filename, s) for s in config_list]
 					self.config.read(config_list)
 				else:
diff --git a/xos/xos_configuration/README.md b/xos/xos_configuration/README.md
new file mode 100644
index 0000000..044d7e0
--- /dev/null
+++ b/xos/xos_configuration/README.md
@@ -0,0 +1,99 @@
+# Managing Configurations
+
+XOS comes with several pre-configured envirnments. The main available configurations are:
+
+- Frontend Only
+- - CORD
+Every configurations come with different settings and different features, from GUI elements to Services.
+
+__NOTE: in this folder files should not be added. They will broke the configuration system.__
+
+## Basic configuration
+
+A common configuration file is saved in `xos/configurations/common/xos_common_config`. In this file are stored all the common configurations for XOS.
+
+This is the base config:
+``
+[plc]
+name=plc
+deployment=plc
+
+[db]
+name=xos
+user=postgres
+password=password
+host=localhost
+port=5432
+
+[api]
+host=localhost
+port=8000
+ssl_key=None
+ssl_cert=None
+ca_ssl_cert=None
+ratelimit_enabled=0
+omf_enabled=0
+mail_support_address=support@localhost
+nova_enabled=True
+logfile=/var/log/xos.log
+
+[nova]
+admin_user=admin@domain.com
+admin_password=admin
+admin_tenant=admin
+url=http://localhost:5000/v2.0/
+default_image=None
+default_flavor=m1.small
+default_security_group=default
+ca_ssl_cert=/etc/ssl/certs/ca-certificates.crt
+
+[observer]
+pretend=False
+backoff_disabled=False
+images_directory=/opt/xos/images
+dependency_graph=/opt/xos/model-deps
+logfile=/var/log/xos_backend.log
+
+[gui]
+disable_minidashboard=True
+branding_name=Open Cloud
+#branding_css= #no branding css is provided by default
+branding_icon=/static/logo.png
+
+``
+
+## Extending configuration
+
+### How it works
+
+In some environment some changes to the configuration are needed, to achieve this XOS reads configurations from a `xos/xos_configuration`.
+
+All the configuration files in this folder will be parsed with [ConfigParser](https://docs.python.org/2/library/configparser.html).
+
+### Exetending a configuration
+
+_An example is available in the CORD config_
+
+These are the basic step to extend a configuration. 
+_From now we'll use `myConf` as placeholder for the current configuration._
+
+**Local Config**
+
+- In your configuration create a new config file named: `xos_<myConf>_config`
+Sample local config:
+``
+[gui]
+branding_name=A BRAND NAME
+branding_icon=/static/my_logo.png
+``
+
+_The file above will change the displayed brand name and the logo in the UI_
+
+**Makefile Changes**
+- Clean the configuration folder: `rm ../../xos_configuration/*`
+- - Add the common config: `cp ../common/xos_common_config ../../xos_configuration/`
+- - Add the local config: `cp ./xos_<myConf>_config ../../xos_configuration/`
+_IMPORTANT: this instructions have to be executed before `docker build`_
+
+
+