diff --git a/js/controllers/website-controller.js b/js/controllers/website-controller.js
index 714bf43..6c4d208 100644
--- a/js/controllers/website-controller.js
+++ b/js/controllers/website-controller.js
@@ -25,6 +25,20 @@ function handleFiles(ev) {
 }
 window.document.body.addEventListener('change', handleFiles);
 
+app.directive('daplieFileChange', function () {
+  return {
+    restrict: 'A',
+    require:"ngModel",
+    link: function (scope, element, attrs, ngModel) {
+      element.bind('change', function (event) {
+        var files = event.target.files;
+        ngModel.$setViewValue(files[0]);
+        scope.$eval(attrs.daplieFileChange);
+      });
+    }
+  };
+});
+
 app.controller('websiteCtrl', [
   '$scope', '$q', 'Auth', 'azp@oauth3.org', '$timeout'
 , function ($scope, $q, Auth, Oauth3, $timeout) {
@@ -140,26 +154,26 @@ app.controller('websiteCtrl', [
     vm.currentHost = record.host; // .replace(new RegExp('\\.' + vm.domain.domain.replace(/\./g, '\\.') + '$', ''));
   };
 
-  vm._createWebsite = function (pkg) {
+  vm._uploadFile = function (pkg, opts) {
     return pkg.add({
-      hostname: vm.currentHost
-    , domain: vm.currentHost
-    , tld: vm.domain.tld
-    , sld: vm.domain.sld
-    //, sub: vm.record.sub
-    , multipart: { site: vm.currentFiles[0] }
+      hostname: opts.currentHost
+    , domain: opts.currentHost
+    , tld: opts.domain.tld
+    , sld: opts.domain.sld
+    //, sub: opts.record.sub
+    , multipart: { site: opts.currentFiles[0] }
     , progress: function (ev) {
         // TODO must digest
-        vm.uploadPercent = Math.round((ev.loaded / ev.total) * 100);
+        opts.uploadPercent = Math.round((ev.loaded / ev.total) * 100);
         // TODO GiB, MiB, KiB, etc
-        vm.uploadTotal = (ev.total / (1024 * 1024)).toFixed(2);
-        vm.uploadProgress = (ev.loaded / (1024 * 1024)).toFixed(2);
+        opts.uploadTotal = (ev.total / (1024 * 1024)).toFixed(2);
+        opts.uploadProgress = (ev.loaded / (1024 * 1024)).toFixed(2);
       }
-    , unzip: vm.unzip
-    , strip: vm.stripZip
-    , path: vm.webPath
+    , unzip: opts.unzip
+    , strip: opts.stripZip
+    , path: opts.webPath
     }).then(function (result) {
-      vm.uploadTotal = 0;
+      opts.uploadTotal = 0;
       window.alert(JSON.stringify(result));
     });
   };
@@ -211,7 +225,7 @@ app.controller('websiteCtrl', [
     if (vm.sites.some(function (r) {
       return -1 !== ('.' + vm.currentHost).indexOf(('.' + r.domain));
     })) {
-      vm._createWebsite(pkg);
+      vm._uploadFile(pkg, vm);
       return;
     }
 
@@ -256,13 +270,20 @@ app.controller('websiteCtrl', [
 
       return prom.then(function () {
         return pkg.claim(domainReq).then(function (result) {
-          return vm._createWebsite(pkg);
+          return vm._uploadFile(pkg, vm);
         });
       });
 
     });
   };
-  vm.createWebsite = vm.Sites.create;
+  vm.Sites.setUpload = function (r) {
+    console.log("Hey! At least it can tell if there's a change!");
+    console.log(r);
+  };
+  vm.Sites.upload = function (r) {
+    var pkg = Auth.oauth3.pkg('www@daplie.com');
+    vm._uploadFile(pkg, r);
+  };
   vm.Sites.archive = function (r) {
     var pkg = Auth.oauth3.pkg('www@daplie.com');
 
diff --git a/templates/website.html b/templates/website.html
index 125fdc3..4a5a5a1 100644
--- a/templates/website.html
+++ b/templates/website.html
@@ -75,7 +75,7 @@
     -->
     
-            
+            
         
         
@@ -85,27 +85,44 @@