diff --git a/Gruntfile.js b/Gruntfile.js
index cf7f5564bcd7462a3a870bd3fc9dbf5f1ae008ba..6e24bf50c755233d1ad8d2ce1569dafb8db53b26 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -3,6 +3,8 @@ var fs = require('fs');
 const sass = require('node-sass');
 
 module.exports = function (grunt) {
+  var lessDir = 'www/less';
+  var lessVendorDir = lessDir + '/lib';
   var sassDir = 'www/scss';
 //   var sassVendorDir = sassDir + '/mixins';
   var cssDir = 'www/css';
@@ -17,6 +19,16 @@ module.exports = function (grunt) {
     jsDir + '/search.js',
   ];
 
+  var wdnMixinLibBaseUrl = 'https://raw.githubusercontent.com/unl/wdntemplates/4.1/wdn/templates_4.1/less/_mixins/';
+  var wdnMixins = [
+    'breakpoints.less',
+    'colors.less',
+    'fonts.less',
+  ];
+  var allMixinsExist = every(wdnMixins, function(value) {
+    return fs.existsSync(lessVendorDir + '/' + value);
+  });
+
 // TODO: Import DCF and UNLedu 5.0 mixins and variables
 //   var dcfMixinLibBaseUrl = 'https://raw.githubusercontent.com/d-c-n/dcf/master/assets/dist/scss/mixins/';
 //   var dcfMixins = [
@@ -29,31 +41,55 @@ module.exports = function (grunt) {
 //     return fs.existsSync(sassVendorDir + '/' + value);
 //   });
 
+  var lessFiles = {};
+  cssFiles.forEach(function(file) {
+    lessFiles[cssDir + '/' + file + '.css'] = lessDir + '/' + file + '.less';
+  });
+
   var sassFiles = {};
   cssFiles.forEach(function(file) {
-    sassFiles[cssDir + '/' + file + '.css'] = sassDir + '/' + file + '.scss';
+    sassFiles[cssDir + '/' + file + '-5.0.css'] = sassDir + '/' + file + '.scss';
   });
 
   var builtJsFiles = {};
   builtJsFiles[jsDir + '/search.min.js'] = jsFiles;
 
-//   var autoprefixPlugin = new (require('less-plugin-autoprefix'))({browsers: ["last 2 versions"]});
-//   var cleanCssPlugin = new (require('less-plugin-clean-css'))();
+  var autoprefixPlugin = new (require('less-plugin-autoprefix'))({browsers: ["last 2 versions"]});
+  var cleanCssPlugin = new (require('less-plugin-clean-css'))();
 
   // load all grunt tasks matching the ['grunt-*', '@*/grunt-*'] patterns
   require('load-grunt-tasks')(grunt);
 
   grunt.initConfig({
 
-//     'curl-dir': {
+    'curl-dir': {
+      'less-libs': {
+        src: wdnMixins.map(function(file) {
+          return wdnMixinLibBaseUrl + file;
+        }),
+        dest: lessVendorDir
+      }
 //       'dcf-mixins': {
 //         src: dcfMixins.map(function(file) {
 //           return dcfMixinLibBaseUrl + file;
 //         }),
 //         dest: sassVendorDir
 //       }
-//       // TODO: add UNLedu 5.0 mixins
-//     },
+      // TODO: add UNLedu 5.0 mixins
+    },
+
+    less: {
+      all: {
+        files: lessFiles,
+        options: {
+          paths: [lessDir],
+          plugins: [
+            autoprefixPlugin,
+            cleanCssPlugin
+          ]
+        }
+      }
+    },
 
     sass: {
 			all: {
@@ -121,12 +157,17 @@ module.exports = function (grunt) {
     },
 
     clean: {
+      lessCss: Object.keys(lessFiles).concat(lessVendorDir),
 //       css: Object.keys(sassFiles).concat(sassVendorDir),
-      css: Object.keys(sassFiles),
+      sassCss: Object.keys(sassFiles),
       js: Object.keys(builtJsFiles).concat(jsDir + '/**/*.map')
     },
 
     watch: {
+      less: {
+        files: lessDir + '/**/*.less',
+        tasks: ['less']
+      },
       sass: {
         files: sassDir + '/**/*.scss',
         tasks: ['sass', 'postcss']
@@ -138,9 +179,9 @@ module.exports = function (grunt) {
   // establish grunt default
   var defaultTasks = ['sass', 'postcss', 'uglify', 'requirejs'];
   var localTasks = defaultTasks.slice();
-//   if (!allMixinsExist) {
-//     defaultTasks.unshift('curl-dir');
-//   }
+  if (!allMixinsExist) {
+    defaultTasks.unshift('curl-dir');
+  }
   grunt.registerTask('default', defaultTasks);
   grunt.registerTask('all-local', localTasks);