diff --git a/CHANGES.rst b/CHANGES.rst
index b5dbffa719..13fced8284 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -35,7 +35,8 @@ Breaking changes:
New features:
-* add items here
+* Add ``plone-patterns-toolbar`` pattern from CMFPlone.
+ [thet]
Bug fixes:
diff --git a/mockup/js/config.js b/mockup/js/config.js
index 70e9a3f89f..96bdc91163 100644
--- a/mockup/js/config.js
+++ b/mockup/js/config.js
@@ -122,6 +122,7 @@
'mockup-patterns-passwordstrength': 'patterns/passwordstrength/pattern',
'mockup-patterns-passwordstrength-url': 'patterns/passwordstrength',
'mockup-patterns-livesearch': 'patterns/livesearch/pattern',
+ 'plone-patterns-toolbar': 'patterns/toolbar/pattern',
'mockup-router': 'js/router',
'mockup-ui-url': 'js/ui',
'mockup-utils': 'js/utils',
diff --git a/mockup/patterns/toolbar/.gitignore b/mockup/patterns/toolbar/.gitignore
deleted file mode 100644
index 3907b5565d..0000000000
--- a/mockup/patterns/toolbar/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-components
-node_modules
diff --git a/mockup/patterns/toolbar/.jshintrc b/mockup/patterns/toolbar/.jshintrc
deleted file mode 100644
index 86ea3b8033..0000000000
--- a/mockup/patterns/toolbar/.jshintrc
+++ /dev/null
@@ -1,31 +0,0 @@
-{
- "bitwise": true,
- "browser": true,
- "curly": true,
- "eqeqeq": true,
- "evil": true,
- "immed": true,
- "latedef": true,
- "newcap": true,
- "noarg": true,
- "noempty": true,
- "nomen": false,
- "nonew": true,
- "plusplus": true,
- "strict": true,
- "trailing": true,
- "undef": true,
- "globals": {
- "afterEach": true,
- "beforeEach": true,
- "console": true,
- "define": false,
- "describe": true,
- "document": false,
- "it": true,
- "require": false,
- "requirejs": true,
- "tinymce": true,
- "window": false
- }
-}
diff --git a/mockup/patterns/toolbar/Gruntfile.js b/mockup/patterns/toolbar/Gruntfile.js
deleted file mode 100644
index 415e93e05d..0000000000
--- a/mockup/patterns/toolbar/Gruntfile.js
+++ /dev/null
@@ -1,40 +0,0 @@
-module.exports = function(grunt) {
-
- // Project configuration.
- grunt.initConfig({
- pkg: grunt.file.readJSON('package.json'),
- bower: {
- target: {
- rjsConfig: 'config.js'
- }
- },
- requirejs: {
- compile: {
- options: {
- name: 'core',
- mainConfigFile: 'config.js',
- out: "jspak.js"
- }
- }
- },
- bowerbuster: {
- path: 'bowerbuster.json'
- },
- buster: {
- test: {
- config: 'buster.js'
- },
- server: {
- port: 1111
- }
- }
- });
-
- grunt.loadNpmTasks('grunt-requirejs');
- grunt.loadNpmTasks('grunt-bower-requirejs');
- grunt.loadNpmTasks('grunt-bower-busterjs');
- grunt.loadNpmTasks('grunt-buster');
-
- grunt.registerTask('default', ['bower', 'requirejs']);
- grunt.registerTask('test', ['bower', 'bowerbuster', 'buster']);
-};
diff --git a/mockup/patterns/toolbar/README.md b/mockup/patterns/toolbar/README.md
deleted file mode 100644
index 7f6593d613..0000000000
--- a/mockup/patterns/toolbar/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# jspak
-
-A sample project where we hook up Bower to RequireJS and Bower to
-Buster.JS, using Grunt.
-
-You need to have nodejs, npm, bower, grunt, buster and PhantomJS
-installed.
-
-Installation:
-
- $ npm install
-
-Install client-side dependencies:
-
- $ bower install
-
-Run the tests with buster (and PhantomJS):
-
- $ grunt test
-
-For more about the background, see this blog post:
-
-http://blog.startifact.com/posts/overwhelmed-by-javascript-dependencies.html
diff --git a/mockup/patterns/toolbar/bower.json b/mockup/patterns/toolbar/bower.json
deleted file mode 100644
index 682bdff049..0000000000
--- a/mockup/patterns/toolbar/bower.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "name": "jspak",
- "version": "0.1.0",
- "ignore": [
- "**/.*",
- "node_modules",
- "components"
- ],
- "dependencies": {
- "jquery": "~2.0.0",
- "requirejs": "",
- "patternslib": "2.0.13"
- },
- "resolutions": {
- "jquery": "~2.0.0",
- }
-}
diff --git a/mockup/patterns/toolbar/bowerbuster.json b/mockup/patterns/toolbar/bowerbuster.json
deleted file mode 100644
index 4332b034b9..0000000000
--- a/mockup/patterns/toolbar/bowerbuster.json
+++ /dev/null
@@ -1 +0,0 @@
-["components/backbone/backbone.js",["components/bootstrap/dist/css/bootstrap.css","components/bootstrap/dist/js/bootstrap.js","components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot","components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg","components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf","components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff"],"components/console-polyfill/index.js","components/es5-shim","components/jquery/jquery.js","components/lodash/dist/lodash.compat.js","components/marked/lib/marked.js","components/react/react.js","components/requirejs-text","components/selectivizr","components/underscore/underscore.js"]
diff --git a/mockup/patterns/toolbar/buster.js b/mockup/patterns/toolbar/buster.js
deleted file mode 100644
index 47a6736a87..0000000000
--- a/mockup/patterns/toolbar/buster.js
+++ /dev/null
@@ -1,25 +0,0 @@
-var config = module.exports;
-
-var fs = require('fs');
-
-var sources = JSON.parse(fs.readFileSync('bowerbuster.json', 'utf8'));
-sources.push('src/**/*.js');
-
-config.core = {
- rootPath: ".",
- environment: "browser",
- libs: [
- 'components/requirejs/require.js',
- 'config.js'
- ],
- sources: sources,
- tests: [
- "test/**/*.js"
- ],
- extensions: [require('buster-amd')],
- "buster-amd": {
- pathMapper: function(path) {
- return path.replace(/\.js$/, "").replace(/^\//, "../");
- }
- }
-};
diff --git a/mockup/patterns/toolbar/config.js b/mockup/patterns/toolbar/config.js
deleted file mode 100644
index 78ba2ad1f8..0000000000
--- a/mockup/patterns/toolbar/config.js
+++ /dev/null
@@ -1,18 +0,0 @@
-require.config({
- baseUrl: 'src',
- paths: {
- backbone: '../components/backbone/backbone',
- bootstrap: '../components/bootstrap/dist/js/bootstrap',
- 'console-polyfill': '../components/console-polyfill/index',
- jquery: '../components/jquery/jquery',
- lodash: '../components/lodash/dist/lodash.compat',
- marked: '../components/marked/lib/marked',
- react: '../components/react/react',
- 'requirejs-text': '../components/requirejs-text/text',
- selectivizr: '../components/selectivizr/selectivizr',
- underscore: '../components/underscore/underscore',
- 'pat-registry': '../components/patternslib/src/core/registry',
- 'pat-base': '../components/patternslib/src/core/base',
- 'plone-patterns-toolbar': 'toolbar'
- }
-});
diff --git a/mockup/patterns/toolbar/jspak.js b/mockup/patterns/toolbar/jspak.js
deleted file mode 100644
index afdec513cf..0000000000
--- a/mockup/patterns/toolbar/jspak.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/*!
- * jQuery JavaScript Library v2.0.0
- * http://jquery.com/
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- *
- * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2013-04-18
- */
-
-/*!
- * Sizzle CSS Selector Engine v1.9.2-pre
- * http://sizzlejs.com/
- *
- * Copyright 2013 jQuery Foundation, Inc. and other contributors
- * Released under the MIT license
- * http://jquery.org/license
- *
- * Date: 2013-04-16
- */
-
-(function(window,undefined){function isArraylike(e){var t=e.length,n=jQuery.type(e);return jQuery.isWindow(e)?!1:e.nodeType===1&&t?!0:n==="array"||n!=="function"&&(t===0||typeof t=="number"&&t>0&&t-1 in e)}function createOptions(e){var t=optionsCache[e]={};return jQuery.each(e.match(core_rnotwhite)||[],function(e,n){t[n]=!0}),t}function Data(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=jQuery.expando+Math.random()}function dataAttr(e,t,n){var r;if(n===undefined&&e.nodeType===1){r="data-"+t.replace(rmultiDash,"-$1").toLowerCase(),n=e.getAttribute(r);if(typeof n=="string"){try{n=n==="true"?!0:n==="false"?!1:n==="null"?null:+n+""===n?+n:rbrace.test(n)?JSON.parse(n):n}catch(i){}data_user.set(e,t,n)}else n=undefined}return n}function returnTrue(){return!0}function returnFalse(){return!1}function safeActiveElement(){try{return document.activeElement}catch(e){}}function sibling(e,t){while((e=e[t])&&e.nodeType!==1);return e}function winnow(e,t,n){if(jQuery.isFunction(t))return jQuery.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return jQuery.grep(e,function(e){return e===t!==n});if(typeof t=="string"){if(isSimple.test(t))return jQuery.filter(t,e,n);t=jQuery.filter(t,e)}return jQuery.grep(e,function(e){return core_indexOf.call(t,e)>=0!==n})}function manipulationTarget(e,t){return jQuery.nodeName(e,"table")&&jQuery.nodeName(t.nodeType===1?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function disableScript(e){return e.type=(e.getAttribute("type")!==null)+"/"+e.type,e}function restoreScript(e){var t=rscriptTypeMasked.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function setGlobalEval(e,t){var n=e.length,r=0;for(;r