diff --git a/app/code/Magento/Quote/Model/Cart/CartTotalRepository.php b/app/code/Magento/Quote/Model/Cart/CartTotalRepository.php
index 9fe69b691424dae3ac30756be9da4e95342653a4..e18ab8587fc71ca0fcf035cfd062d825bf38c60d 100644
--- a/app/code/Magento/Quote/Model/Cart/CartTotalRepository.php
+++ b/app/code/Magento/Quote/Model/Cart/CartTotalRepository.php
@@ -10,6 +10,7 @@ use Magento\Quote\Api\CartRepositoryInterface;
 use Magento\Quote\Api\CartTotalRepositoryInterface;
 use Magento\Catalog\Helper\Product\ConfigurationPool;
 use Magento\Framework\Api\DataObjectHelper;
+use Magento\Framework\Api\ExtensibleDataInterface;
 use Magento\Quote\Model\Cart\Totals\ItemConverter;
 use Magento\Quote\Api\CouponManagementInterface;
 
@@ -94,6 +95,7 @@ class CartTotalRepository implements CartTotalRepositoryInterface
             $addressTotalsData = $quote->getShippingAddress()->getData();
             $addressTotals = $quote->getShippingAddress()->getTotals();
         }
+        unset($addressTotalsData[ExtensibleDataInterface::EXTENSION_ATTRIBUTES_KEY]);
 
         /** @var \Magento\Quote\Api\Data\TotalsInterface $quoteTotals */
         $quoteTotals = $this->totalsFactory->create();
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/accordion/accordion.js b/dev/tests/js/JsTestDriver/testsuite/mage/accordion/accordion.js
deleted file mode 100644
index 562c5c096b654f6c628f81c1a660317cd2a3b864..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/accordion/accordion.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * @category    mage.js
- * @package     test
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-/*
-
- */
-test( "Initialization", function() {
-    expect(2);
-    var accordion = $("<div></div>");
-    accordion.accordion();
-    ok( accordion.is(':mage-accordion'), "widget instantiated" );
-    accordion.accordion('destroy');
-    ok( !accordion.is(':mage-accordion'), "widget destroyed" );
-});
-
-
-
-test( "One-collapsible element", function() {
-    expect(4);
-    var accordion = $('<div></div>');
-    var title1 = $('<div data-role="collapsible"></div>').appendTo(accordion);
-    var content1 = $('<div data-role="content"></div>').appendTo(accordion);
-    var title2 = $('<div data-role="collapsible"></div>').appendTo(accordion);
-    var content2 = $('<div data-role="content"></div>').appendTo(accordion);
-    accordion.appendTo("body");
-
-    accordion.accordion();
-    ok( content1.is(':visible'), "content visible" );
-    ok( content2.is(':hidden'), "content hidden" );
-    title2.trigger('click');
-    ok( content1.is(':hidden'), "content hidden" );
-    ok( content2.is(':visible'), "content visible" );
-    accordion.accordion('destroy');
-
-});
-
-test( "Multi-collapsible elements", function() {
-    expect(4);
-    var accordion = $('<div></div>');
-    var title1 = $('<div data-role="collapsible"></div>').appendTo(accordion);
-    var content1 = $('<div data-role="content"></div>').appendTo(accordion);
-    var title2 = $('<div data-role="collapsible"></div>').appendTo(accordion);
-    var content2 = $('<div data-role="content"></div>').appendTo(accordion);
-    accordion.appendTo("body");
-
-    accordion.accordion({multipleCollapsible:true});
-    ok( content1.is(':visible'), "content visible" );
-    ok( content2.is(':hidden'), "content hidden" );
-    title2.trigger('click');
-    ok( content1.is(':visible'), "content visible" );
-    ok( content2.is(':visible'), "content visible" );
-    accordion.accordion('destroy');
-});
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/accordion/index.html b/dev/tests/js/JsTestDriver/testsuite/mage/accordion/index.html
deleted file mode 100644
index 093284c6f4fa853f5f3eeeca5c228a9e83286dab..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/accordion/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
-/**
- * @category    mage.accordion
- * @package     test
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-
-<!DOCTYPE html>
-<html>
-<head>
-    <meta charset="utf-8">
-    <title>Accordion Widget: QUnit Tests </title>
-    <base href="../../../"/>
-    <link type="text/css" rel="stylesheet" href="framework/qunit/qunit-1.14.0.css"/>
-    <script type="text/javascript" src="../../../pub/lib/jquery.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/jquery/jquery-ui.js"></script>
-    <script type="text/javascript" src="framework/qunit/qunit-1.14.0.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/mage.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/tabs.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/accordion.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/collapsible.js"></script>
-    <script type="text/javascript" src="testsuite/mage/accordion/accordion.js"></script>
-</head>
-<body>
-<div id="qunit"></div>
-<div id="qunit-fixture">
-</div>
-</body>
-</html>
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/calendar/calendar-qunit.js b/dev/tests/js/JsTestDriver/testsuite/mage/calendar/calendar-qunit.js
deleted file mode 100644
index 60dffe84db0fc0b653855fc0437e55aa2dcf6f3a..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/calendar/calendar-qunit.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-test( "initialization", function() {
-	var calendar = $('#calendar').calendar();
-	ok( calendar.is(':mage-calendar'), "this test is fine" );
-	calendar.calendar('destroy');
-});
-test( "global configuration merge", function() {
-	$.extend(true, $, {
-        calendarConfig: {
-            showOn: 'button',
-            showAnim: '',
-            buttonImageOnly: true,
-            showButtonPanel: true,
-            showWeek: true,
-            timeFormat: '',
-            showTime: false,
-            showHour: false,
-            showMinute: false
-        }
-    });
-    var calendar = $('#calendar').calendar();
-    equal('button', calendar.calendar('option', 'showOn'));
-    equal('', calendar.calendar('option', 'showAnim'));
-    ok(calendar.calendar('option', 'buttonImageOnly'));
-    ok(calendar.calendar('option', 'showButtonPanel'));
-    ok(calendar.calendar('option', 'showWeek'));
-    equal('', calendar.calendar('option', 'timeFormat'));
-    equal(false, calendar.calendar('option', 'showTime'));
-    equal(false, calendar.calendar('option', 'showHour'));
-    equal(false, calendar.calendar('option', 'showMinute'));
-	calendar.calendar('destroy');
-	delete $.calendarConfig;
-});
-test( "specifying AM/PM in timeformat option changes AMPM option to true", function(){
-	var calendar = $('#calendar').calendar({timeFormat: 'hh:mm tt', ampm: false});
-    ok(calendar.calendar('option', 'ampm'));
-    calendar.calendar('destroy');
-});
-test( "omitting AM/PM in timeformat option changes AMPM option to false", function(){
-	var calendar = $('#calendar').calendar({timeFormat: 'hh:mm'});
-    notEqual(true, calendar.calendar('option', 'ampm'));
-    calendar.calendar('destroy');
-});
-test( "with server timezone offset", function(){
-	var serverTimezoneSeconds = 1346122095,
-	calendar = $('#calendar').calendar({serverTimezoneSeconds: serverTimezoneSeconds}),
-        currentDate = new Date();
-    currentDate.setTime((serverTimezoneSeconds + currentDate.getTimezoneOffset() * 60) * 1000);
-    ok(currentDate.toString() === calendar.calendar('getTimezoneDate').toString());
-    calendar.calendar('destroy');
-});
-test( "without sever timezone offset", function() {
-	var calendar = $('#calendar').calendar(),
-        currentDate = new Date();
-    ok(currentDate.toString() === calendar.calendar('getTimezoneDate').toString());
-    calendar.calendar('destroy');
-});
-test( "dateTime format conversions", function() {
-	var calendar = $('#calendar').calendar({dateFormat: 'M/d/yy', timeFormat: 'h:mm a'});
-    equal('mm/d/yy', calendar.calendar('option', 'dateFormat'));
-    equal('h:mm tt', calendar.calendar('option', 'timeFormat'));
-    calendar.calendar('destroy');
-    calendar.calendar({dateFormat: 'MMMM/EEEE/yyyy', timeFormat: 'HH:mm'});
-    equal('MM/DD/yy', calendar.calendar('option', 'dateFormat'));
-    equal('hh:mm', calendar.calendar('option', 'timeFormat'));
-    calendar.calendar('destroy');
-});
-test( "destroy", function() {
-	var calendar = $('#calendar').calendar(),
-        calendarExist = calendar.is(':mage-calendar');
-    calendar.calendar('destroy');
-    equal(true, calendarExist != calendar.is(':mage-calendar'));
-});
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/calendar/calendar-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/calendar/calendar-test.js
deleted file mode 100644
index 7748106b303c3998974a745c98223e31ea04ab83..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/calendar/calendar-test.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-CalendarTest = TestCase('CalendarTest');
-CalendarTest.prototype.testInit = function() {
-    /*:DOC += <input type="text" id="calendar" /> */
-    var calendar = jQuery('#calendar').calendar();
-    assertEquals(true, calendar.is(':mage-calendar'));
-    calendar.calendar('destroy');
-};
-CalendarTest.prototype.testGlobalConfigurationMerge = function() {
-    /*:DOC += <input type="text" id="calendar" /> */
-    $.extend(true, $, {
-        calendarConfig: {
-            showOn: 'button',
-            showAnim: '',
-            buttonImageOnly: true,
-            showButtonPanel: true,
-            showWeek: true,
-            timeFormat: '',
-            showTime: false,
-            showHour: false,
-            showMinute: false
-        }
-    });
-    var calendar = $('#calendar').calendar();
-    assertEquals('button', calendar.calendar('option', 'showOn'));
-    assertEquals('', calendar.calendar('option', 'showAnim'));
-    assertEquals(true, calendar.calendar('option', 'buttonImageOnly'));
-    assertEquals(true, calendar.calendar('option', 'showButtonPanel'));
-    assertEquals(true, calendar.calendar('option', 'showWeek'));
-    assertEquals('', calendar.calendar('option', 'timeFormat'));
-    assertEquals(false, calendar.calendar('option', 'showTime'));
-    assertEquals(false, calendar.calendar('option', 'showHour'));
-    assertEquals(false, calendar.calendar('option', 'showMinute'));
-    calendar.calendar('destroy');
-    delete $.calendarConfig;
-};
-CalendarTest.prototype.testEnableAMPM = function() {
-    /*:DOC += <input type="text" id="calendar" /> */
-    var calendar = $('#calendar').calendar({timeFormat: 'hh:mm tt', ampm: false});
-    assertEquals(true, calendar.calendar('option', 'ampm'));
-    calendar.calendar('destroy');
-};
-CalendarTest.prototype.testDisableAMPM = function() {
-    /*:DOC += <input type="text" id="calendar" /> */
-    var calendar = $('#calendar').calendar({timeFormat: 'hh:mm'});
-    assertTrue(!calendar.calendar('option', 'ampm'));
-    calendar.calendar('destroy');
-};
-CalendarTest.prototype.testWithServerTimezoneOffset = function() {
-    /*:DOC += <input type="text" id="calendar" /> */
-    var serverTimezoneSeconds = 1346122095,
-        calendar = $('#calendar').calendar({serverTimezoneSeconds: serverTimezoneSeconds}),
-        currentDate = new Date();
-    currentDate.setTime((serverTimezoneSeconds + currentDate.getTimezoneOffset() * 60) * 1000);
-    assertEquals(true, currentDate.toString() === calendar.calendar('getTimezoneDate').toString());
-    calendar.calendar('destroy');
-};
-CalendarTest.prototype.testWithServerTimezoneShift = function() {
-    /*:DOC += <input type="text" id="calendar" /> */
-    var serverTimezoneOffset = 43200,
-        calendar = $('#calendar').calendar({serverTimezoneOffset: serverTimezoneOffset}),
-        currentDate = new Date();
-
-    setTimeout(function () {
-        currentDate.setTime(currentDate.getTime() + (serverTimezoneOffset + currentDate.getTimezoneOffset() * 60) * 1000);
-        assertEquals(true, currentDate.toString() === calendar.calendar('getTimezoneDate').toString());
-        calendar.calendar('destroy');
-    }, 61000);
-};
-CalendarTest.prototype.testWithoutServerTimezoneOffset = function() {
-    /*:DOC += <input type="text" id="calendar" /> */
-    var calendar = $('#calendar').calendar(),
-        currentDate = new Date();
-    assertEquals(true, currentDate.toString() === calendar.calendar('getTimezoneDate').toString());
-    calendar.calendar('destroy');
-};
-CalendarTest.prototype.testInitDateTimePicker = function() {
-    /*:DOC += <input type="text" id="calendar" /> */
-    var calendar = $('#calendar').calendar();
-    assertEquals(true, calendar.hasClass('_has-datepicker'));
-    calendar.calendar('destroy');
-};
-CalendarTest.prototype.testDateTimeMapping = function() {
-    /*:DOC += <input type="text" id="calendar" /> */
-    var calendar = $('#calendar').calendar({dateFormat: 'M/d/yy', timeFormat: 'h:mm a'});
-    assertEquals('mm/d/yy', calendar.calendar('option', 'dateFormat'));
-    assertEquals('h:mm TT', calendar.calendar('option', 'timeFormat'));
-    calendar.calendar('destroy');
-    calendar.calendar({dateFormat: 'MMMM/EEEE/yyyy'});
-    assertEquals('MM/DD/yy', calendar.calendar('option', 'dateFormat'));
-    calendar.calendar('destroy');
-};
-CalendarTest.prototype.testDestroy = function() {
-    /*:DOC += <input type="text" id="calendar" /> */
-    var calendar = $('#calendar').calendar(),
-        calendarExist = calendar.is(':mage-calendar');
-    calendar.calendar('destroy');
-    assertEquals(true, calendarExist != calendar.is(':mage-calendar'));
-};
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/calendar/calendar.html b/dev/tests/js/JsTestDriver/testsuite/mage/calendar/calendar.html
deleted file mode 100644
index b474dc2d5ce95461ba7aac1e57f667f8c70407e9..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/calendar/calendar.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
-/**
- * @category    mage.calendar
- * @package     test
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-
-<!DOCTYPE html>
-<html>
-<head>
-  <meta charset="utf-8">
-  <title>Calendar Widget: QUnit Tests </title>
-	<base href="../../../"/>
-    <link type="text/css" rel="stylesheet" href="framework/qunit/qunit-1.14.0.css"/>
-    <script type="text/javascript" src="../../../lib/web/jquery.js"></script>
-    <script type="text/javascript" src="../../../lib/web/jquery/jquery-ui.js"></script>
-    <script type="text/javascript" src="../../../lib/web/jquery/jquery-ui-timepicker-addon.js"></script>
-    <script type="text/javascript" src="framework/qunit/qunit-1.14.0.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/mage.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/calendar.js"></script>
-    <script type="text/javascript" src="testsuite/mage/calendar/calendar-qunit.js"></script>
-</head>
-<body>
-  <div id="qunit"></div>
-  <div id="qunit-fixture">
-  	<input type="text" id="calendar" />
-  </div>
-</body>
-</html>
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/calendar/date-range-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/calendar/date-range-test.js
deleted file mode 100644
index 61211c067ad129e4993d0847e014cdb21aa22bdc..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/calendar/date-range-test.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-DaterangeTest = TestCase('DaterangeTest');
-DaterangeTest.prototype.testInit = function() {
-    /*:DOC +=
-     <div id="date-range" />
-     */
-    var dateRange = jQuery('#date-range').dateRange();
-    assertEquals(true, dateRange.is(':mage-dateRange'));
-    dateRange.dateRange('destroy');
-};
-DaterangeTest.prototype.testInitDateRangeDatepickers = function() {
-    /*:DOC +=
-     <div id="date-range">
-         <input type="text" id="from" />
-         <input type="text" id="to" />
-     </div>
-     */
-    var options = {
-            from: {
-                id: "from"
-            },
-            to: {
-                id: "to"
-            }
-        },
-        dateRange = $('#date-range').dateRange(options),
-        from = $('#'+options.from.id),
-        to = $('#'+options.to.id);
-
-    assertEquals(true, from.hasClass('_has-datepicker'));
-    assertEquals(true, to.hasClass('_has-datepicker'));
-    dateRange.dateRange('destroy');
-};
-DaterangeTest.prototype.testDestroy = function() {
-    /*:DOC +=
-     <div id="date-range">
-     <input type="text" id="from" />
-     <input type="text" id="to" />
-     </div>
-     */
-    var options = {
-        from: {
-            id: "from"
-        },
-        to: {
-            id: "to"
-        }
-    },
-        dateRange = $('#date-range').dateRange(options),
-        from = $('#'+options.from.id),
-        to = $('#'+options.to.id),
-        dateRangeExist = dateRange.is(':mage-dateRange'),
-        fromExist = from.hasClass('_has-datepicker'),
-        toExist = to.hasClass('_has-datepicker');
-
-    dateRange.dateRange('destroy');
-    assertEquals(true, dateRangeExist != dateRange.is(':mage-dateRange'));
-    assertEquals(true, fromExist != from.hasClass('_has-datepicker'));
-    assertEquals(true, toExist != to.hasClass('_has-datepicker'));
-};
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/collapsible/content.html b/dev/tests/js/JsTestDriver/testsuite/mage/collapsible/content.html
deleted file mode 100644
index e81938dfbeaba32386a7fe89121e9a653febf991..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/collapsible/content.html
+++ /dev/null
@@ -1,14 +0,0 @@
-<!--
-/**
- * @category    mage.collapsible
- * @package     test
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-
-<HTML>
-<body>
-    <p>Test text</p>
-</body>
-</HTML>
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/collapsible/index.html b/dev/tests/js/JsTestDriver/testsuite/mage/collapsible/index.html
deleted file mode 100644
index ccfd4d97f03312ac84950f5655e1276a25777f26..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/collapsible/index.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<!--
-/**
- * @category    mage.collapsible
- * @package     test
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-
-
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Unit test</title>
-    <base href="../../../"/>
-    <link type="text/css" rel="stylesheet" href="framework/qunit/qunit-1.14.0.css"/>
-    <script type="text/javascript" src="framework/qunit/qunit-1.14.0.js"></script>
-    <script src="../../../pub/lib/jquery.js"></script>
-    <script src="../../../pub/lib/jquery/jquery-ui.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/mage.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/collapsible.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/bootstrap.js"></script>
-    <script type="text/javascript" src="testsuite/mage/collapsible/test-collapsible.js"></script>
-</head>
-<body>
-<div id="qunit"></div>
-<div id="qunit-fixture">
-</div>
-</body>
-</html>
-
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/collapsible/test-collapsible.js b/dev/tests/js/JsTestDriver/testsuite/mage/collapsible/test-collapsible.js
deleted file mode 100644
index 1a22e5a79eb1df0d65e897859733ff95074f5e4f..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/collapsible/test-collapsible.js
+++ /dev/null
@@ -1,180 +0,0 @@
-/**
- * @category    mage.collapsible
- * @package     test
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-/*
-    Test if the collapsible widget gets initialized when is called and destroy function works
- */
-test('initialization & destroy', function() {
-    expect(2);
-    var group = $('<div id="1"></div>');
-    group.collapsible();
-    ok( group.is(':mage-collapsible'), "widget instantiated" );
-    group.collapsible('destroy');
-    ok( !group.is(':mage-collapsible'), "widget destroyed" );
-});
-
-/*
- Test enable, disable, activate, deactivate functions
- */
-test('Enable, disable, activate, deactivate methods', function() {
-    expect(5);
-    var group = $('<div id="2"></div>');
-    var title = $('<div data-role="title"></div>');
-    var content = $('<div data-role="content"></div>');
-    title.appendTo(group);
-    content.appendTo(group);
-    group.appendTo("body");
-    group.collapsible();
-    group.collapsible("deactivate");
-    ok(content.is(':hidden'), "Content is collapsed");
-    group.collapsible("activate");
-    ok(content.is(':visible'), "Content is expanded");
-    group.collapsible("disable");
-    ok(content.is(':hidden'), "Content is collapsed");
-    group.collapsible("activate");
-    ok(content.is(':hidden'), "Content is collapsed");
-    group.collapsible("enable");
-    group.collapsible("activate");
-    ok(content.is(':visible'), "Content is expanded");
-    group.collapsible('destroy');
-});
-
-/*
-    Test if the widget gets expanded/collapsed when the title is clicked
- */
-test('Collapse and expand', function() {
-    expect(3);
-    var group = $('<div id="3"></div>');
-    var title = $('<div data-role="title"></div>');
-    var content = $('<div data-role="content"></div>');
-    title.appendTo(group);
-    content.appendTo(group);
-    group.appendTo("body");
-    group.collapsible();
-    group.collapsible("deactivate");
-    ok(content.is(':hidden'), "Content is collapsed");
-    title.trigger("click");
-    ok(content.is(':visible'), "Content gets expanded on click title");
-    title.trigger("click");
-    ok(content.is(':hidden'), "Content gets collapsed on click again");
-    group.collapsible('destroy');
-});
-
-
-/*
- Test state Classes
- */
-test('State classes', function() {
-    expect(3);
-    var group = $('<div id="4"></div>');
-    var title = $('<div data-role="title"></div>');
-    var content = $('<div data-role="content"></div>');
-    title.appendTo(group);
-    content.appendTo(group);
-    group.collapsible({openedState:"opened", closedState:"closed", disabledState:"disabled"});
-    ok( group.hasClass("closed"));
-    title.trigger("click");
-    ok( group.hasClass("opened"));
-    group.collapsible("disable");
-    ok( group.hasClass("disabled"));
-    group.collapsible('destroy');
-});
-
-/*
-    Test if icons are added to title when widget gets initialized and are removed when gets destroyed
- */
-test('Create  & destroy icons', function() {
-    expect(2);
-    var group = $('<div id="5"></div>');
-    var title = $('<div data-role="title"></div>');
-    var content = $('<div data-role="content"></div>');
-    title.appendTo(group);
-    content.appendTo(group);
-    group.collapsible({icons: {header:"minus",activeHeader:"plus"}});
-    ok(title.children("[data-role=icons]").length, "Icons added to title" );
-    group.collapsible('destroy');
-    ok(!title.children("[data-role=icons]").length, "Icons removed from title" );
-});
-
-/*
-    Test if icon classes are changed when content gets expanded/collapsed
- */
-test('Change icons when content gets expanded/collapsed', function() {
-    expect(2);
-    var group = $('<div id="6"></div>');
-    var title = $('<div data-role="title"></div>');
-    var content = $('<div data-role="content"></div>');
-    title.appendTo(group);
-    content.appendTo(group);
-    group.collapsible({icons: {header:"minus",activeHeader:"plus"}});
-    group.collapsible("deactivate");
-    var icons = group.collapsible("option","icons");
-    ok(title.children("[data-role=icons]").hasClass(icons.header), "When content is collapsed,header has the right class for icons" );
-    title.trigger("click");
-    ok(title.children("[data-role=icons]").hasClass(icons.activeHeader), "When content is expanded,header has the right class for icons" );
-    group.collapsible('destroy');
-});
-
-
-/*
-    Test if content gets expanded/collapsed when certain keys are pressed
- */
-asyncTest( "keyboard support", function() {
-
-    expect( 5 );
-    var group = $('<div id="7"></div>');
-    var title = $('<div data-role="title"></div>');
-    var content = $('<div data-role="content"></div>');
-    title.appendTo(group);
-    content.appendTo(group);
-    group.appendTo("body");
-    group.collapsible();
-    group.collapsible("deactivate");
-
-    title.on("focus",function(ev){
-        ok(content.is(':hidden'), "Content is collapsed");
-        title.trigger($.Event( 'keydown', { keyCode: $.ui.keyCode.ENTER } ));
-        ok(content.is(':visible'), "Content is expanded");
-        title.trigger($.Event( 'keydown', { keyCode: $.ui.keyCode.ENTER } ));
-        ok(content.is(':hidden'), "Content is collapsed");
-        title.trigger($.Event( 'keydown', { keyCode: $.ui.keyCode.SPACE } ));
-        ok(content.is(':visible'), "Content is expanded");
-        title.trigger($.Event( 'keydown', { keyCode: $.ui.keyCode.SPACE } ));
-        ok(content.is(':hidden'), "Content is collapsed");
-        group.collapsible('destroy');
-        start();
-    } );
-
-    setTimeout(function(){
-        title.focus();
-    },10);
-
-});
-
-/*
-    Test if content gets updated via Ajax when title is clicked
- */
-test('Update content via ajax', function() {
-    expect(2);
-    var group = $('<div id="8"></div>');
-    var title = $('<div data-role="title"></div>');
-    var content = $('<div data-role="content"></div>');
-    var ajax = $('<a data-ajax="true" href="testsuite/mage/collapsible/content.html"></a>');
-    title.appendTo(group);
-    content.appendTo(group);
-    ajax.appendTo(content);
-    group.appendTo("body");
-    group.collapsible({ajaxContent : true});
-    group.collapsible("deactivate");
-    ok(!content.children("p").length, "Content has no data");
-    title.trigger("click");
-    ok(content.children("p"), "Content gets data from content.html");
-    group.collapsible('destroy');
-});
-
-
-
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/decorate-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/decorate-test.js
deleted file mode 100644
index 96bad35a17e2e3a2ceca85ae498cc9eeee90cf7e..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/decorate-test.js
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-DecoratorTest = TestCase('DecoratorTest');
-DecoratorTest.prototype.testDecoratorList = function () {
-    /*:DOC += <ul id="list">
-     <li>item1</li>
-     <li>item2</li>
-     <li>item3</li>
-     <li>item4</li>
-     </ul>
-     */
-    var list = $('#list');
-    list.decorate('list');
-    assertTrue($(list.find('li')[0]).hasClass('odd'));
-    assertFalse($(list.find('li')[0]).hasClass('even'));
-    assertTrue($(list.find('li')[1]).hasClass('even'));
-    assertFalse($(list.find('li')[1]).hasClass('odd'));
-    assertTrue($(list.find('li')[2]).hasClass('odd'));
-    assertFalse($(list.find('li')[2]).hasClass('even'));
-    assertTrue($(list.find('li')[3]).hasClass('even'));
-    assertFalse($(list.find('li')[3]).hasClass('odd'));
-    assertTrue($(list.find('li')[3]).hasClass('last'));
-};
-
-DecoratorTest.prototype.testDecoratorGeneral = function () {
-    /*:DOC += <div id="foo">
-     <div class="item even">item1</div>
-     <div class="item odd">item2</div>
-     <div class="item odd">item3</div>
-     <div class="item even">item4</div>
-     </div>
-     */
-    var itemClass = '.item';
-    $(itemClass).decorate('generic');
-    assertTrue($($(itemClass)[0]).hasClass('odd'));
-    assertFalse($($(itemClass)[0]).hasClass('even'));
-    assertTrue($($(itemClass)[0]).hasClass('first'));
-    assertFalse($($(itemClass)[0]).hasClass('last'));
-
-    assertFalse($($(itemClass)[1]).hasClass('odd'));
-    assertTrue($($(itemClass)[1]).hasClass('even'));
-    assertFalse($($(itemClass)[1]).hasClass('first'));
-    assertFalse($($(itemClass)[1]).hasClass('last'));
-
-    assertTrue($($(itemClass)[2]).hasClass('odd'));
-    assertFalse($($(itemClass)[2]).hasClass('even'));
-    assertFalse($($(itemClass)[2]).hasClass('first'));
-    assertFalse($($(itemClass)[2]).hasClass('last'));
-
-    assertFalse($($(itemClass)[3]).hasClass('odd'));
-    assertTrue($($(itemClass)[3]).hasClass('even'));
-    assertFalse($($(itemClass)[3]).hasClass('first'));
-    assertTrue($($(itemClass)[3]).hasClass('last'));
-};
-
-DecoratorTest.prototype.testDecoratorTable = function (){
-    /*:DOC += <table id="foo">
-     <thead>
-     <tr>
-     <th>Month</th>
-     <th>Savings</th>
-     </tr>
-     </thead>
-     <tfoot>
-     <tr>
-     <td>Sum</td>
-     <td>$180</td>
-     </tr>
-     </tfoot>
-     <tbody>
-     <tr>
-     <td>January</td>
-     <td>$100</td>
-     </tr>
-     <tr>
-     <td>February</td>
-     <td>$80</td>
-     </tr>
-     </tbody>
-     </table>
-     */
-    var tableId = '#foo';
-    $(tableId).decorate('table');
-    assertTrue($(tableId).find('thead tr').hasClass('first'));
-    assertTrue($(tableId).find('thead tr').hasClass('last'));
-    assertFalse($(tableId).find('thead tr').hasClass('odd'));
-    assertFalse($(tableId).find('thead tr').hasClass('even'));
-
-    assertTrue($(tableId).find('tfoot tr').hasClass('first'));
-    assertTrue($(tableId).find('tfoot tr').hasClass('last'));
-    assertFalse($(tableId).find('tfoot tr').hasClass('odd'));
-    assertFalse($(tableId).find('tfoot tr').hasClass('even'));
-
-    assertFalse($(tableId).find('tfoot tr td').last().hasClass('first'));
-    assertTrue($(tableId).find('tfoot tr td').last().hasClass('last'));
-    assertFalse($(tableId).find('tfoot tr td').last().hasClass('odd'));
-    assertFalse($(tableId).find('tfoot tr td').last().hasClass('even'));
-
-    assertTrue($(tableId).find('tbody tr').first().hasClass('first'));
-    assertTrue($(tableId).find('tbody tr').first().hasClass('odd'));
-    assertFalse($(tableId).find('tbody tr').first().hasClass('last'));
-    assertFalse($(tableId).find('tbody tr').first().hasClass('even'));
-    assertFalse($(tableId).find('tbody tr').last().hasClass('first'));
-    assertFalse($(tableId).find('tbody tr').last().hasClass('odd'));
-    assertTrue($(tableId).find('tbody tr').last().hasClass('last'));
-    assertTrue($(tableId).find('tbody tr').last().hasClass('even'));
-
-    assertFalse($(tableId).find('tbody tr td').last().hasClass('first'));
-    assertFalse($(tableId).find('tbody tr td').last().hasClass('odd'));
-    assertTrue($(tableId).find('tbody tr td').last().hasClass('last'));
-    assertFalse($(tableId).find('tbody tr td').last().hasClass('even'));
-};
-
-DecoratorTest.prototype.testDecoratorDataList = function () {
-    /*:DOC += <dl id="data-list">
-        <dt>item</dt>
-        <dt>item</dt>
-        <dd>item</dd>
-        <dd>item</dd>
-     </dl>
-     */
-    var listId = '#data-list';
-    $(listId).decorate('dataList');
-    assertTrue($(listId).find('dt').first().hasClass('odd'));
-    assertFalse($(listId).find('dt').first().hasClass('even'));
-    assertFalse($(listId).find('dt').first().hasClass('last'));
-
-    assertTrue($(listId).find('dt').last().hasClass('even'));
-    assertFalse($(listId).find('dt').last().hasClass('odd'));
-    assertTrue($(listId).find('dt').last().hasClass('last'));
-
-    assertTrue($(listId).find('dd').first().hasClass('odd'));
-    assertFalse($(listId).find('dd').first().hasClass('even'));
-    assertFalse($(listId).find('dd').first().hasClass('last'));
-
-    assertTrue($(listId).find('dd').last().hasClass('even'));
-    assertFalse($(listId).find('dd').last().hasClass('odd'));
-    assertTrue($(listId).find('dd').last().hasClass('last'));
-};
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/dropdown/index.html b/dev/tests/js/JsTestDriver/testsuite/mage/dropdown/index.html
deleted file mode 100644
index 3d6ed5a7c1d2824f3d404cb885c54e2823559654..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/dropdown/index.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!--
-/**
- * @category    mage.dropdown
- * @package     test
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Unit test</title>
-    <base href="../../../"/>
-    <link type="text/css" rel="stylesheet" href="framework/qunit/qunit-1.14.0.css"/>
-    <script type="text/javascript" src="framework/qunit/qunit-1.14.0.js"></script>
-    <script src="../../../lib/web/jquery.js"></script>
-    <script src="../../../lib/web/jquery/jquery-ui.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/mage.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/dropdown.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/bootstrap.js"></script>
-    <script type="text/javascript" src="testsuite/mage/dropdown/test-dropdown.js"></script>
-
-</head>
-<body>
-<div id="qunit"></div>
-<div id="qunit-fixture">
-</div>
-</body>
-</html>
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/dropdown/test-dropdown.js b/dev/tests/js/JsTestDriver/testsuite/mage/dropdown/test-dropdown.js
deleted file mode 100644
index e67c92b3d4018ce5e2a7bc5160d89ebd49aee967..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/dropdown/test-dropdown.js
+++ /dev/null
@@ -1,270 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-/*
-    testing if dialog opens when the triggerEvent is triggered
- */
-test( "triggerEvent", function() {
-    expect(2);
-    var opener = $('<div></div>');
-    var dialog = $('<div></div>');
-    dialog.dropdownDialog({"triggerEvent":"click", "triggerTarget":opener});
-    opener.trigger("click");
-    equal(dialog.dropdownDialog("isOpen"), true, "Dropdown opens when click opener");
-    dialog.dropdownDialog( "destroy" );
-
-    dialog.dropdownDialog({"triggerEvent":null, "triggerTarget":opener});
-    opener.trigger("click");
-    equal(dialog.dropdownDialog("isOpen"), false, "Dropdown doesn't open when click opener");
-    dialog.dropdownDialog( "destroy" );
-
-});
-
-/*
-    testing if a specified class is added to the trigger
- */
-test( "triggerClass", function() {
-    expect(2);
-    var opener = $('<div></div>');
-    var dialog = $('<div></div>');
-    dialog.dropdownDialog({"triggerTarget":opener,"triggerClass":"active"});
-    dialog.dropdownDialog("open");
-    ok( opener.hasClass("active"), "Class added to opener when dialog opens" );
-    dialog.dropdownDialog("close");
-    dialog.dropdownDialog( "destroy" );
-
-    dialog.dropdownDialog({"triggerEvent":opener, "triggerClass":null});
-    dialog.dropdownDialog("open");
-    ok( !opener.hasClass("active"), "Class added to opener when dialog opens" );
-    dialog.dropdownDialog("close");
-    dialog.dropdownDialog( "destroy" );
-
-});
-
-/*
-    testing if a specified class is added to the element which the dialog appends to
- */
-test( "parentClass", function() {
-    expect(2);
-    var parent = $('<div></div>');
-    var dialog = $('<div></div>');
-
-    dialog.dropdownDialog({"parentClass":"active","appendTo":parent});
-    dialog.dropdownDialog("open");
-    ok( parent.hasClass("active"), "Class is added to parent when dialog opens" );
-    dialog.dropdownDialog("close");
-    dialog.dropdownDialog( "destroy" );
-
-    dialog.dropdownDialog({"parentClass":null,"appendTo":parent});
-    dialog.dropdownDialog("open");
-    ok( !parent.hasClass("active"), "No class is added to parent when dialog opens" );
-    dialog.dropdownDialog("close");
-    dialog.dropdownDialog( "destroy" );
-
-});
-
-/*
-    testing if a specified class is added to the element that becomes dialog
- */
-test( "dialogContentClass", function() {
-    expect(2);
-    var dialog = $('<div></div>');
-
-    dialog.dropdownDialog({"dialogContentClass":"active"});
-    dialog.dropdownDialog("open");
-    ok( $('.ui-dialog-content').hasClass("active"), "Class is added to dialog content when dialog opens" );
-    dialog.dropdownDialog("close");
-    dialog.dropdownDialog( "destroy" );
-
-    dialog.dropdownDialog({"dialogContentClass": null});
-    dialog.dropdownDialog("open");
-    ok( !$('.ui-dialog-content').hasClass("active"), "No class is added to dialog content" );
-    dialog.dropdownDialog("close");
-    dialog.dropdownDialog( "destroy" );
-});
-
-/*
- testing if a specified class is added to dialog
- */
-test( "defaultDialogClass", function() {
-    expect(3);
-    var dialog = $('<div></div>');
-
-    dialog.dropdownDialog({"defaultDialogClass":"custom"});
-    ok( $('.ui-dialog').hasClass("custom"), "Class is added to dialog" );
-    ok( !$('.ui-dialog').hasClass("mage-dropdown-dialog"), "Default class has been overwritten" );
-    dialog.dropdownDialog( "destroy" );
-
-    dialog.dropdownDialog({});
-    ok( $('.ui-dialog').hasClass("mage-dropdown-dialog"), "Default class hasn't been overwritten" );
-    dialog.dropdownDialog( "destroy" );
-});
-
-/*
-    testing if the specified trigger actually opens the dialog
- */
-test( "triggerTarget", function() {
-    expect(2);
-    var opener = $('<div></div>');
-    var dialog = $('<div></div>');
-
-    dialog.dropdownDialog({"triggerTarget":opener});
-    opener.trigger("click");
-    equal(dialog.dropdownDialog("isOpen"), true, "Dropdown opens when click opener");
-    dialog.dropdownDialog("close");
-    dialog.dropdownDialog( "destroy" );
-
-    dialog.dropdownDialog({"triggerTarget":null});
-    opener.trigger("click");
-    equal(dialog.dropdownDialog("isOpen"), false, "Dropdown doesn't open when click opener");
-    dialog.dropdownDialog( "destroy" );
-});
-
-/*
-    testing if the dialog gets closed when clicking outside of it
- */
-test( "closeOnClickOutside", function() {
-    expect(2);
-    var outside = $('<div></div>').attr({"id":"outside"});
-    var dialog = $('<div></div>').attr({"id":"dialog"});
-    outside.appendTo("#qunit-fixture");
-    dialog.appendTo("#qunit-fixture");
-
-    dialog.dropdownDialog({"closeOnClickOutside":true});
-    dialog.dropdownDialog("open");
-    outside.trigger("click");
-    equal(dialog.dropdownDialog("isOpen"), false, "Dropdown closes when click outside dropdown");
-    dialog.dropdownDialog( "destroy" );
-
-    dialog.dropdownDialog({"closeOnClickOutside":false});
-    dialog.dropdownDialog("open");
-    outside.trigger("click");
-    equal(dialog.dropdownDialog("isOpen"), true, "Dropdown doesn't close when click outside dropdown");
-    dialog.dropdownDialog( "destroy" );
-});
-
-/*
-    testing if the dialog gets closed when mouse leaves the dialog area
- */
-asyncTest( "closeOnMouseLeave true", function() {
-    expect(1);
-    var outside = $('<div></div>').attr({"id":"outside"});
-    var dialog = $('<div></div>').attr({"id":"dialog"});
-    var opener = $('<div></div>').attr({"id":"opener"});
-    outside.appendTo("#qunit-fixture");
-    dialog.appendTo("#qunit-fixture");
-    opener.appendTo("#qunit-fixture");
-
-    dialog.dropdownDialog({"closeOnMouseLeave":true});
-    dialog.dropdownDialog("open");
-    dialog.trigger("mouseenter");
-    dialog.trigger("mouseleave");
-
-    setTimeout(function() {
-        equal(dialog.dropdownDialog("isOpen"), false, "Dropdown closes when mouseleave the dropdown area");
-        dialog.dropdownDialog( "destroy" );
-        start();
-    }, 3000);
-
-});
-
-/*
- testing if the dialog gets closed when mouse leaves the dialog area
- */
-asyncTest( "closeOnMouseLeave false", function() {
-    expect(1);
-    var outside = $('<div></div>').attr({"id":"outside"});
-    var dialog = $('<div></div>').attr({"id":"dialog"});
-    var opener = $('<div></div>').attr({"id":"opener"});
-    outside.appendTo("#qunit-fixture");
-    dialog.appendTo("#qunit-fixture");
-    opener.appendTo("#qunit-fixture");
-
-    dialog.dropdownDialog({"closeOnMouseLeave":false});
-    dialog.dropdownDialog("open");
-    dialog.trigger("mouseenter");
-    dialog.trigger("mouseleave");
-
-    setTimeout(function() {
-        equal(dialog.dropdownDialog("isOpen"), true, "Dropdown doesn't close when mouseleave the dropdown area");
-        dialog.dropdownDialog( "destroy" );
-        start();
-    }, 3000);
-
-});
-
-/*
-    testing if the dialog gets closed with the specified delay
- */
-asyncTest( "timeout", function() {
-    expect(2);
-    var outside = $('<div></div>').attr({"id":"outside"});
-    var dialog = $('<div></div>').attr({"id":"dialog"});
-    var opener = $('<div></div>').attr({"id":"opener"});
-    outside.appendTo("#qunit-fixture");
-    dialog.appendTo("#qunit-fixture");
-    opener.appendTo("#qunit-fixture");
-
-    dialog.dropdownDialog({"timeout":2000});
-    dialog.dropdownDialog("open");
-    dialog.trigger("mouseenter");
-    dialog.trigger("mouseleave");
-    equal(dialog.dropdownDialog("isOpen"), true, "Dropdown doesn't close when mouseleave the dropdown area");
-    setTimeout(function() {
-        equal(dialog.dropdownDialog("isOpen"), false, "Dropdown closes when mouseleave the dropdown area, after timeout passed");
-        dialog.dropdownDialog( "destroy" );
-        start();
-    }, 3000);
-
-});
-
-/*
-    testing if the title bar is prevented from being created
- */
-test( "createTitileBar", function() {
-    expect(2);
-    var dialog = $('<div></div>');
-    dialog.dropdownDialog({"createTitleBar":true});
-    ok(($(".ui-dialog").find(".ui-dialog-titlebar").length > 0), "Title bar is created");
-    dialog.dropdownDialog( "destroy" );
-
-    dialog.dropdownDialog({"createTitleBar":false});
-    ok($(".ui-dialog").find(".ui-dialog-titlebar").length <= 0, "Title bar isn't created");
-    dialog.dropdownDialog( "destroy" );
-});
-
-/*
-    testing if the position function gets disabled
- */
-test( "autoPosition", function() {
-    expect(2);
-    var dialog = $('<div></div>');
-    dialog.dropdownDialog({"autoPosition":false});
-    dialog.dropdownDialog("open");
-    ok(($(".ui-dialog").css("top") === 'auto'), "_position function disabled");
-    dialog.dropdownDialog( "destroy" );
-
-    dialog.dropdownDialog({"autoPosition":true});
-    dialog.dropdownDialog("open");
-    ok(($(".ui-dialog").css("top") !== '0px'), "_position function enabled");
-    dialog.dropdownDialog( "destroy" );
-});
-
-/*
-    testing if the size function gets disabled
- */
-test( "autoSize", function() {
-    expect(2);
-    var dialog = $('<div></div>');
-    dialog.dropdownDialog({"autoSize":true, width:"300"});
-    dialog.dropdownDialog("open");
-    ok(($(".ui-dialog").css("width") === '300px'), "_size function enabled");
-    dialog.dropdownDialog( "destroy" );
-
-    dialog.dropdownDialog({"autoSize":false, width:"300"});
-    dialog.dropdownDialog("open");
-    ok($(".ui-dialog").css("width") !== '300px', "_size function disabled");
-    dialog.dropdownDialog( "destroy" );
-});
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/form/form-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/form/form-test.js
deleted file mode 100644
index 83bdefd399eafbeb1baf8a44320786c7035fab3c..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/form/form-test.js
+++ /dev/null
@@ -1,241 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-FormTest = TestCase('FormTest');
-FormTest.prototype.setUp = function() {
-    /*:DOC += <form id="form" action="action/url" method="GET", target="_self" ></form>*/
-};
-FormTest.prototype.tearDown = function() {
-    var formInstance = jQuery('#form').data('form');
-    if(formInstance && formInstance.destroy) {
-        formInstance.destroy();
-    }
-};
-FormTest.prototype.testInit = function() {
-    var form = jQuery('#form').form();
-    assertTrue(form.is(':mage-form'));
-};
-FormTest.prototype.testRollback = function() {
-    var form = jQuery('#form').form(),
-        initialFormAttrs = {
-            action: form.prop('action'),
-            target: form.prop('target'),
-            method: form.prop('method')
-        };
-
-    form.data("form").oldAttributes = initialFormAttrs;
-    form.prop({
-        action: 'new/action/url',
-        target: '_blank',
-        method: 'POST'
-    });
-
-    assertNotEquals(form.prop('action'), initialFormAttrs.action);
-    assertNotEquals(form.prop('target'), initialFormAttrs.target);
-    assertNotEquals(form.prop('method'), initialFormAttrs.method);
-    form.data("form")._rollback();
-    assertEquals(form.prop('action'), initialFormAttrs.action);
-    assertEquals(form.prop('target'), initialFormAttrs.target);
-    assertEquals(form.prop('method'), initialFormAttrs.method);
-};
-FormTest.prototype.testGetHandlers = function() {
-    var form = jQuery('#form').form(),
-        handlersData = form.form('option', 'handlersData'),
-        handlers = [];
-    $.each(handlersData, function(key) {
-        handlers.push(key);
-    });
-    assertEquals(handlers.join(' '), form.data("form")._getHandlers().join(' '));
-};
-FormTest.prototype.testStoreAttribute = function() {
-    var form = jQuery('#form').form(),
-        initialFormAttrs = {
-            action: form.attr('action'),
-            target: form.attr('target'),
-            method: form.attr('method')
-        };
-    form.data("form")._storeAttribute('action');
-    form.data("form")._storeAttribute('target');
-    form.data("form")._storeAttribute('method');
-
-    assertEquals(form.data("form").oldAttributes.action, initialFormAttrs.action);
-    assertEquals(form.data("form").oldAttributes.target, initialFormAttrs.target);
-    assertEquals(form.data("form").oldAttributes.method, initialFormAttrs.method);
-};
-FormTest.prototype.testBind = function() {
-    var form = jQuery('#form').form(),
-        submitted = false,
-        handlersData = form.form('option', 'handlersData');
-
-    form.on('submit', function(e) {
-        submitted = true;
-        e.stopImmediatePropagation();
-        e.preventDefault();
-    });
-    $.each(handlersData, function(key) {
-        form.trigger(key);
-        assertTrue(submitted);
-        submitted = false;
-    });
-    form.off('submit');
-};
-FormTest.prototype.testGetActionUrl = function() {
-    var form = jQuery('#form').form(),
-        action = form.attr('action'),
-        testUrl = 'new/action/url',
-        testArgs = {
-            args: {arg: 'value'}
-        };
-
-    form.data("form")._storeAttribute('action');
-    assertEquals(form.data("form")._getActionUrl(testArgs), action + '/arg/value/');
-    assertEquals(form.data("form")._getActionUrl(testUrl), testUrl);
-    assertEquals(form.data("form")._getActionUrl(), action);
-};
-FormTest.prototype.testProcessData = function() {
-    var form = jQuery('#form').form(),
-        initialFormAttrs = {
-            action: form.attr('action'),
-            target: form.attr('target'),
-            method: form.attr('method')
-        },
-        testSimpleData = {
-            action: 'new/action/url',
-            target: '_blank',
-            method: 'POST'
-        },
-        testActionArgsData = {
-            action: {
-                args: {
-                    arg: 'value'
-                }
-            }
-        };
-    var processedData = form.data("form")._processData(testSimpleData);
-
-    assertEquals(form.data("form").oldAttributes.action, initialFormAttrs.action);
-    assertEquals(form.data("form").oldAttributes.target, initialFormAttrs.target);
-    assertEquals(form.data("form").oldAttributes.method, initialFormAttrs.method);
-
-    assertEquals(processedData.action, testSimpleData.action);
-    assertEquals(processedData.target, testSimpleData.target);
-    assertEquals(processedData.method, testSimpleData.method);
-
-    form.data("form")._rollback();
-
-    processedData = form.data("form")._processData(testActionArgsData);
-    form.data("form")._storeAttribute('action');
-    var newActionUrl = form.data("form")._getActionUrl(testActionArgsData.action);
-
-    assertEquals(processedData.action, newActionUrl);
-};
-FormTest.prototype.testBeforeSubmit = function() {
-    /*:DOC += <form id="test-form"></form> */
-    var testHandler = {
-            action: {
-                args: {
-                    arg1: 'value1'
-                }
-            }
-        },
-        form = jQuery('#form').form({handlersData: {
-                testHandler: testHandler
-            }
-        }),
-        beforeSubmitData = {
-            action: {
-                args: {
-                    arg2: 'value2'
-                }
-            },
-            target: '_blank'
-        },
-        eventData = {
-            method: 'POST'
-        },
-        resultData = $.extend(
-            true,
-            {},
-            testHandler,
-            beforeSubmitData,
-            eventData
-        );
-    form.data("form")._storeAttribute('action');
-
-    var testForm = jQuery('#test-form');
-    resultData = form.data("form")._processData(resultData);
-    testForm.prop(resultData);
-
-    form.on('beforeSubmit', function(e, data) {
-        jQuery.extend(data, beforeSubmitData);
-    });
-    form.on('submit', function(e) {
-        e.stopImmediatePropagation();
-        e.preventDefault();
-    });
-    form.data("form")._beforeSubmit('testHandler', eventData);
-
-    assertEquals(testForm.prop('action'), form.prop('action'));
-    assertEquals(testForm.prop('target'), form.prop('target'));
-    assertEquals(testForm.prop('method'), form.prop('method'));
-};
-FormTest.prototype.testSubmit = function() {
-    var form = jQuery('#form').form({
-            handlersData: {
-                save: {}
-            }
-        }),
-        formSubmitted = false;
-
-    form.data("form")._storeAttribute('action');
-    form.data("form")._storeAttribute('target');
-    form.data("form")._storeAttribute('method');
-    form
-        .on('submit', function(e) {
-            e.preventDefault();
-            e.stopImmediatePropagation();
-            e.preventDefault();
-            formSubmitted = true;
-        })
-        .prop({
-            action: 'new/action/url',
-            target: '_blank',
-            method: 'POST'
-        });
-
-    form.data("form")._submit({type: 'save'});
-
-    assertEquals(form.attr('action'), form.data("form").oldAttributes.action);
-    assertEquals(form.attr('target'), form.data("form").oldAttributes.target);
-    assertEquals(form.attr('method'), form.data("form").oldAttributes.method);
-    assertTrue(formSubmitted);
-    form.off('submit');
-};
-FormTest.prototype.testBuildURL = function() {
-    var dataProvider = [
-        {
-            params: ['http://domain.com//', {'key[one]': 'value 1', 'key2': '# value'}],
-            expected: 'http://domain.com/key[one]/value%201/key2/%23%20value/'
-        },
-        {
-            params: ['http://domain.com', {'key[one]': 'value 1', 'key2': '# value'}],
-            expected: 'http://domain.com/key[one]/value%201/key2/%23%20value/'
-        },
-        {
-            params: ['http://domain.com?some=param', {'key[one]': 'value 1', 'key2': '# value'}],
-            expected: 'http://domain.com?some=param&key[one]=value%201&key2=%23%20value'
-        },
-        {
-            params: ['http://domain.com?some=param&', {'key[one]': 'value 1', 'key2': '# value'}],
-            expected: 'http://domain.com?some=param&key[one]=value%201&key2=%23%20value'
-        }
-    ],
-        method = jQuery.mage.form._proto._buildURL,
-        quantity = dataProvider.length;
-
-    expectAsserts(quantity);
-    for (var i = 0; i < quantity; i++) {
-        assertEquals(dataProvider[i].expected, method.apply(null, dataProvider[i].params));
-    }
-};
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/loader/jquery-loader-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/loader/jquery-loader-test.js
deleted file mode 100644
index 174a4efc14da10b00b46360830f8011f1297c961..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/loader/jquery-loader-test.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-TestCase('options', function() {
-	expect(3);
-
-	var element = $('<div>');
-	element.appendTo('body');
-	element.loader();
-	element.loader('show');
-	equal( element.find('p').text(), 'Please wait...', '.loader() text matches' );
-	equal( element.find('img').prop('src').split('/').pop(), 'icon.gif', '.loader() icons match' );
-	equal( element.find('img').prop('alt'), 'Loading...', '.loader() image alt text matches' );
-	element.loader('destroy');
-
-});
-
-TestCase( 'element init', function() {
-	expect(1);
-
-	var element = $('<div>');
-	element.appendTo('body');
-	element.loader();
-	element.loader('show');
-    equal(element.is(':mage-loader'), true, '.loader() init on element');
-    element.loader('destroy');
-
-});
-
-TestCase( 'body init', function() {
-	expect(1);
-
-	//Initialize Loader on Body
-	var body = $('body').loader();
-    body.loader('show');
-    equal(body.is(':mage-loader'), true, '.loader() init on body');
-    body.loader('destroy');
-});
-
-TestCase( 'show/hide', function() {
-	expect(3);
-
-	var element = $('<div>');
-	element.appendTo('body');
-	element.loader();
-
-	//Loader show
-	element.loader('show');
-	equal($('.loading-mask').is(':visible'), true, '.loader() open');
-
-	//Loader hide
-	element.loader('hide');
-	equal($('.loading-mask').is( ":hidden" ), true, '.loader() closed' );
-
-	//Loader hide on process complete
-    element.loader('show');
-    element.trigger('processStop');
-    equal($('.loading-mask').is('visible'), false, '.loader() closed after process');
-
-    element.loader('destroy');
-
-});
-
-TestCase( 'destroy', function() {
-	expect(1);
-
-	var element = $("#loader").loader();
-	element.loader('show');
-    element.loader('destroy');
-    equal( $('.loading-mask').is(':visible'), false, '.loader() destroyed');
-
-});
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/loader/loader-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/loader/loader-test.js
deleted file mode 100644
index 3dd08f57ab8b3e7d8129c281682045472a8ae5f1..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/loader/loader-test.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-LoaderTest = TestCase('LoaderTest');
-LoaderTest.prototype.setUp = function() {
-    /*:DOC += <div id="loader"></div> */
-};
-LoaderTest.prototype.tearDown = function() {
-    var loaderInstance = jQuery('#loader').data('loader');
-    if(loaderInstance && loaderInstance.destroy) {
-        loaderInstance.destroy();
-    }
-};
-LoaderTest.prototype.getInstance = function() {
-    return jQuery('#loader').data('loader');
-};
-LoaderTest.prototype.testInit = function() {
-    var div = jQuery('#loader').loader();
-    div.loader('show');
-    assertEquals(true, div.is(':mage-loader'));
-};
-// @TODO Need to be fixed to avoid errors on the bamboo server in context of MAGETWO-5085 ticket
-/*LoaderTest.prototype._testCreateOnBeforeSend = function() {
-    /*:DOC += <div id="loader"></div> */
-/*  var loader = jQuery('#loader').trigger('ajaxSend');
-    assertEquals(true, loader.is(':mage-loader'));
-    loader.loader('destroy');
-};*/
-LoaderTest.prototype.testLoaderOnBody = function() {
-    var body = jQuery('body').loader();
-    body.loader('show');
-    assertEquals(true, jQuery('body div:first').is('.loading-mask'));
-    body.loader('destroy');
-};
-LoaderTest.prototype.testLoaderOnDOMElement = function() {
-    var div = jQuery('#loader').loader(),
-        loaderInstance = this.getInstance();
-    div.loader('show');
-    assertEquals(true, div.find(':first-child').is(loaderInstance.spinner));
-};
-LoaderTest.prototype.testLoaderOptions = function() {
-    /*:DOC += <div id="loader"></div> */
-    var div = jQuery('#loader').loader({
-            icon: 'icon.gif',
-            texts: {
-                loaderText: 'Loader Text',
-                imgAlt: 'Image Alt Text'
-            }
-        }),
-        loaderInstance = this.getInstance();
-    div.loader('show');
-    assertEquals('icon.gif', loaderInstance.spinner.find('img').attr('src'));
-    assertEquals('Image Alt Text', loaderInstance.spinner.find('img').attr('alt'));
-    assertEquals('Loader Text', loaderInstance.spinner.find('div.popup-inner').text());
-    div.loader('destroy');
-    div.loader({
-        template:'<div id="test-template"></div>'
-    });
-    div.loader('show');
-    loaderInstance = this.getInstance();
-    assertEquals(true, loaderInstance.spinner.is('#test-template'));
-    div.loader('destroy');
-};
-LoaderTest.prototype.testHideOnComplete = function() {
-    /*:DOC += <div id="loader"></div> */
-    var div = jQuery('#loader').loader();
-    div.loader('show');
-    loaderIsVisible = jQuery('.loading-mask').is(':visible');
-    div.trigger('processStop');
-    assertEquals(false, jQuery('.loading-mask').is(':visible') === loaderIsVisible);
-};
-LoaderTest.prototype.testRender = function() {
-    /*:DOC += <div id="loader" style="widht:200px; height:200px;"></div> */
-    var div = jQuery('#loader').loader();
-    div.loader('show');
-    assertEquals(true, $('.loading-mask').is(':visible'));
-};
-LoaderTest.prototype.testShowHide = function() {
-    /*:DOC += <div id="loader" style="widht:200px; height:200px;"></div> */
-    var div = jQuery('#loader').loader();
-    div.loader('show');
-    assertEquals(true, $('.loading-mask').is(':visible'));
-    div.loader('hide');
-    assertEquals(false, $('.loading-mask').is(':visible'));
-};
-LoaderTest.prototype.testDestroy = function() {
-    /*:DOC += <div id="loader"></div> */
-    var div = jQuery('#loader').loader(),
-        loaderExist = div.is(':mage-loader');
-    div.loader('destroy');
-    assertEquals(false, div.is(':mage-loader') === loaderExist);
-};
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/loader/loader.html b/dev/tests/js/JsTestDriver/testsuite/mage/loader/loader.html
deleted file mode 100644
index 362dec71382764384fcac497dee708f07c3c0a63..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/loader/loader.html
+++ /dev/null
@@ -1,25 +0,0 @@
-<!--
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Unit test</title>
-    <base href="../../../"/>
-    <link type="text/css" rel="stylesheet" href="framework/qunit/qunit-1.14.0.css"/>
-    <script src="../../../lib/web/jquery.js"></script>
-    <script src="../../../lib/web/jquery/jquery-ui.js"></script>
-    <script type="text/javascript" src="framework/qunit/qunit-1.14.0.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/mage.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/bootstrap.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/loader.js"></script>
-    <script type="text/javascript" src="testsuite/mage/loader/jquery-loader-test.js"></script>
-</head>
-<body>
-    <div id="qunit"></div>
-    <div id="qunit-fixture"></div>
-</body>
-</html>
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/menu/test-menu.js b/dev/tests/js/JsTestDriver/testsuite/mage/menu/test-menu.js
deleted file mode 100644
index 0e1c4a3682b890bdd9593836303a62c51d2dd1dc..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/menu/test-menu.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * @category    mage.js
- * @package     test
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
- /*
-    Set key logger to check key press event 
- */
- function KeyLogger( target ) {
-  if ( !(this instanceof KeyLogger) ) {
-    return new KeyLogger( target );
-  }
-  this.target = target;
-  this.log = [];
- 
-  var self = this;
-
-  this.target.off( 'keydown' ).on( 'keydown', function( event ) {
-    self.log.push( event.keyCode );
-  });
-}
-/*
-    testing if menu get expanded class when option set to true
- */
-test( 'Menu Expanded', function() {
-    expect(1);
-    var menu = $('#menu');
-    var menuItems = menu.find('li');
-    var submenu = menuItems.find('ul');
-    menu.menu({
-        expanded: true
-    });
-    ok(submenu.hasClass('expanded'), 'Expanded Class added');
-});
-/*
-    testing if down arrow is pressed
- */
-test( 'Down Arrow', function() {
-    expect(1);
-    var event,
-        menu = $('#menu'),
-        keys = KeyLogger(menu);
-    event = $.Event('keydown');
-    event.keyCode = $.ui.keyCode.DOWN;
-    menu.trigger( event );
-    equal( keys.log[ 0 ], 40, 'Down Arrow Was Pressed' );
-});
-/*
-    testing if up arrow is pressed
- */
-test( 'Up Arrow', function() {
-    expect(1);
-    var event,
-        menu = $('#menu'),
-        keys = KeyLogger(menu);
-    event = $.Event('keydown');
-    event.keyCode = $.ui.keyCode.UP;
-    menu.trigger( event );
-    equal( keys.log[ 0 ], 38, 'Up Arrow Was Pressed' );
-});
-/*
-    testing if left arrow is pressed
- */
-test( 'Left Arrow', function() {
-    expect(1);
-    var event,
-        menu = $('#menu'),
-        keys = KeyLogger(menu);
-    event = $.Event('keydown');
-    event.keyCode = $.ui.keyCode.LEFT;
-    menu.trigger( event );
-    equal( keys.log[ 0 ], 37, 'Left Arrow Was Pressed' );
-});
-/*
-    testing if right arrow is pressed
- */
-test( 'Right Arrow', function() {
-    expect(1);
-    var event,
-        menu = $('#menu'),
-        keys = KeyLogger(menu);
-    event = $.Event('keydown');
-    event.keyCode = $.ui.keyCode.RIGHT;
-    menu.trigger( event );
-    equal( keys.log[ 0 ], 39, 'Right Arrow Was Pressed' );
-});
-/*
-    testing if max limit being set
- */
-test( 'Max Limit', function() {
-    expect(1);
-    var menu = $('#menu');
-    menu.navigation({
-        maxItems: 3
-    });
-    var menuItems = menu.find('> li:visible');
-    equal(menuItems.length, 4, 'Max Limit Reach');
-});
-/*
-    testing if responsive menu is set
- */
-test( 'Responsive: More Menu', function() {
-    expect(1);
-    var menu = $('#menu');
-    menu.navigation({
-        responsive: 'onResize'
-    });
-    ok($('body').find('.ui-menu.more'), 'More Menu Created');
-});
-
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/suggest/suggest-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/suggest/suggest-test.js
deleted file mode 100644
index 4b2b961f753eea9dc0321f2b788d1196d5cc3696..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/suggest/suggest-test.js
+++ /dev/null
@@ -1,952 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-SuggestTest = TestCase('SuggestTest');
-SuggestTest.prototype.setUp = function() {
-    /*:DOC += <input name="test-suggest" id="suggest" />*/
-    this.suggestElement = jQuery('#suggest');
-};
-SuggestTest.prototype.tearDown = function() {
-    this.suggestDestroy();
-};
-SuggestTest.prototype.suggestDestroy = function() {
-    if(this.suggestElement.data('suggest')) {
-        this.suggestElement.suggest('destroy');
-    }
-};
-SuggestTest.prototype.suggestCreate = function(options, element) {
-    return (element || this.suggestElement).suggest(options || {} ).data('suggest');
-};
-SuggestTest.prototype.uiHash = {
-    item: {
-        id: 1,
-        label: 'Test Label'
-    }
-};
-
-SuggestTest.prototype.testInit = function() {
-    this.suggestElement.suggest();
-    assertTrue(this.suggestElement.is(':mage-suggest'));
-};
-SuggestTest.prototype.testCreate = function() {
-    var suggestOptions = {
-            controls: {
-                selector: '.test',
-                eventsMap: {
-                    focus: ['testfocus'],
-                    blur: ['testblur'],
-                    select: ['testselect']
-                }
-            },
-            showRecent: true,
-            storageKey: 'jsTestDriver-test-suggest-recent',
-            multiselect: true
-        },
-        recentItems = [{
-            id: "1",
-            "label": "TestLabel1"
-        },
-        {
-            id: "2",
-            label: "TestLabel2"
-        }],
-        setTemplateExecuted,
-        prepareValueFieldExecuted,
-        renderExecuted,
-        bindExecuted;
-
-    if(window.localStorage) {
-        localStorage.setItem(suggestOptions.storageKey, JSON.stringify(recentItems));
-    }
-
-    var suggestInstance = this.suggestCreate(suggestOptions),
-        nonSelectedItem = {id: '', label: ''};
-
-    assertEquals(null, suggestInstance._term);
-    assertEquals(suggestInstance._nonSelectedItem, nonSelectedItem);
-    assertNull(suggestInstance._renderedContext);
-    assertEquals(suggestInstance._selectedItem, nonSelectedItem);
-    var control = suggestInstance.options.controls;
-    assertEquals(suggestInstance._control, control);
-    assertEquals(suggestInstance._recentItems, window.localStorage ? recentItems : []);
-    assertTrue(suggestInstance.valueField.is(':hidden'));
-    if(window.localStorage) {
-        localStorage.removeItem(suggestOptions.storageKey);
-    }
-};
-SuggestTest.prototype.testRender = function() {
-    var suggestOptions = {
-        dropdownWrapper: '<div class="wrapper-test"></div>',
-        className: 'test-suggest',
-        inputWrapper: '<div class="test-input-wrapper"></div>'
-    };
-
-    var suggestInstance = this.suggestCreate(suggestOptions);
-    suggestInstance._render();
-
-    assertTrue(suggestInstance.dropdown.hasClass('wrapper-test'));
-    assertTrue(suggestInstance.dropdown.is(':hidden'));
-    assertTrue(suggestInstance.element.closest('.test-input-wrapper').size() > 0);
-    assertTrue(suggestInstance.element.closest('.' + suggestOptions.className).size() > 0);
-    assertEquals(suggestInstance.element.attr('autocomplete'), 'off');
-
-    suggestOptions.appendMethod = 'before';
-    this.suggestDestroy();
-    suggestInstance = this.suggestCreate(suggestOptions);
-    suggestInstance._render();
-    assertTrue(suggestInstance.element.prev().is(suggestInstance.dropdown));
-
-    suggestOptions.appendMethod = 'after';
-    this.suggestDestroy();
-    suggestInstance = this.suggestCreate(suggestOptions);
-    suggestInstance._render();
-    assertTrue(suggestInstance.element.next().is(suggestInstance.dropdown));
-};
-SuggestTest.prototype.testCreateValueField = function() {
-    var suggestInstance = this.suggestCreate(),
-        valueField = suggestInstance._createValueField();
-    assertTrue(valueField.is('input'));
-    assertTrue(valueField.is(':hidden'));
-    this.suggestDestroy();
-
-    suggestInstance = this.suggestCreate({multiselect: true});
-    valueField = suggestInstance._createValueField();
-    assertTrue(valueField.is('select'));
-    assertTrue(valueField.is(':hidden'));
-    assertEquals(valueField.attr('multiple'), 'multiple');
-};
-SuggestTest.prototype.testPrepareValueField = function() {
-    var suggestInstance = this.suggestCreate(),
-        suggestName = this.suggestElement.attr('name');
-    suggestInstance._prepareValueField();
-
-    assertNotUndefined(suggestInstance.valueField);
-    assertTrue(suggestInstance.element.prev().is(suggestInstance.valueField));
-    assertUndefined(suggestInstance.element.attr('name'));
-    assertEquals(suggestInstance.valueField.attr('name'), suggestName);
-    this.suggestDestroy();
-
-
-    var valueField = jQuery('<input id="suggest-single-select-value" type="hidden" />');
-    jQuery('body').append(valueField);
-    suggestInstance = this.suggestCreate({valueField: '#suggest-single-select-value'});
-    assertTrue(suggestInstance.valueField.is(valueField));
-};
-SuggestTest.prototype.testDestroy = function() {
-    var suggestOptions = {
-            inputWrapper: '<div class="test-input-wrapper"></div>',
-            valueField: null
-        },
-        suggestInstance = this.suggestCreate(suggestOptions),
-        suggestName = suggestInstance.valueField.attr('name');
-
-    assertNotUndefined(suggestInstance.dropdown);
-    assertNotUndefined(suggestInstance.valueField);
-    assertUndefined(this.suggestElement.attr('name'));
-
-    this.suggestElement.suggest('destroy');
-
-    assertEquals(this.suggestElement.closest('.test-input-wrapper').length, 0);
-    assertUndefined(this.suggestElement.attr('autocomplete'));
-    assertEquals(this.suggestElement.attr('name'), suggestName);
-    assertFalse(suggestInstance.valueField.parents('html').length > 0);
-    assertFalse(suggestInstance.dropdown.parents('html').length > 0);
-};
-SuggestTest.prototype.testValue = function() {
-    var value = 'test-value';
-    this.suggestElement.val(value);
-    jQuery('body').append('<div id="suggest-div">' + value + '</div>');
-
-    var suggestInputInsatnce = this.suggestCreate(),
-        suggestDivInsatnce = this.suggestCreate(null, jQuery('#suggest-div'));
-
-    assertEquals(suggestInputInsatnce._value(), value);
-    assertEquals(suggestDivInsatnce._value(), value);
-};
-SuggestTest.prototype.testProxyEvents = function() {
-    var fakeEvent = $.extend({}, $.Event('keydown'), {
-            ctrlKey: false,
-            keyCode: $.ui.keyCode.ENTER,
-            which: $.ui.keyCode.ENTER
-        }),
-        suggestInstance = this.suggestCreate({controls: {selector: null}}),
-        ctrlKey,
-        keyCode,
-        which;
-
-    suggestInstance.dropdown.on('keydown', function(e) {
-        ctrlKey = e.ctrlKey;
-        keyCode = e.keyCode;
-        which = e.which;
-    });
-
-    suggestInstance._proxyEvents(fakeEvent);
-
-    assertEquals(ctrlKey, fakeEvent.ctrlKey);
-    assertEquals(keyCode, fakeEvent.keyCode);
-    assertEquals(which, fakeEvent.which);
-};
-SuggestTest.prototype.testBind = function() {
-    var eventIsBinded = false,
-        suggestOptions = {
-            events: {
-                click: function() {
-                    eventIsBinded = true;
-                }
-            }
-        };
-    this.suggestCreate(suggestOptions);
-
-    this.suggestElement.trigger('click');
-    assertTrue(eventIsBinded);
-};
-SuggestTest.prototype.testChange = function() {
-    var changeIsTriggered,
-        suggestInstance = this.suggestCreate();
-
-    suggestInstance._term = 'changed';
-    this.suggestElement.on('suggestchange', function(e) {
-        changeIsTriggered = true;
-    });
-
-    suggestInstance._change($.Event('click'));
-    assertTrue(changeIsTriggered);
-};
-SuggestTest.prototype.testBindDropdown = function() {
-    var suggestOptions = {
-        controls: {
-                eventsMap: {
-                    focus: ['testFocus'],
-                    blur: ['testBlur'],
-                    select: ['testSelect']
-                }
-            }
-        },
-        suggestInstance = this.suggestCreate(suggestOptions),
-        focusTriggered,
-        blurTriggered,
-        selectTriggered;
-
-    suggestInstance._onSelectItem = function() {
-        selectTriggered = true;
-    };
-    suggestInstance._focusItem = function() {
-        focusTriggered = true;
-    };
-    suggestInstance._blurItem = function() {
-        blurTriggered = true;
-    };
-    suggestInstance._bindDropdown();
-
-    suggestInstance.dropdown.trigger('testFocus');
-    suggestInstance.dropdown.trigger('testBlur');
-    suggestInstance.dropdown.trigger('testSelect');
-
-    assertTrue(focusTriggered);
-    assertTrue(blurTriggered);
-    assertTrue(selectTriggered);
-};
-SuggestTest.prototype.testTrigger = function() {
-    var propogationStopped = true,
-        suggestInstance = this.suggestCreate();
-
-    this.suggestElement
-        .on('suggesttestevent', function() {
-            return false;
-        });
-    this.suggestElement.parent().on('suggesttestevent', function() {
-            propogationStopped = false;
-        });
-    suggestInstance._trigger('testevent');
-
-    assertTrue(propogationStopped);
-};
-SuggestTest.prototype.testFocusItem = function() {
-    var focusUiParam = false,
-        suggestInstance = this.suggestCreate();
-
-    this.suggestElement.on('suggestfocus', function(e, ui) {
-        focusUiParam = ui;
-    });
-
-    assertUndefined(suggestInstance._focused);
-    assertEquals(suggestInstance.element.val(), '');
-
-    suggestInstance._focusItem($.Event('focus'), this.uiHash);
-    assertEquals(suggestInstance._focused, this.uiHash.item);
-    assertEquals(focusUiParam, this.uiHash);
-    assertEquals(suggestInstance.element.val(), this.uiHash.item.label);
-};
-SuggestTest.prototype.testBlurItem = function() {
-    var suggestInstance = this.suggestCreate();
-
-    suggestInstance._focusItem($.Event('focus'), this.uiHash);
-    assertEquals(suggestInstance._focused, this.uiHash.item);
-    assertEquals(suggestInstance.element.val(), this.uiHash.item.label);
-
-    suggestInstance._blurItem();
-    assertNull(suggestInstance._focused);
-    //assertEquals(suggestInstance.element.val(), suggestInstance._term.toString());
-};
-SuggestTest.prototype.testOnSelectItem = function() {
-    var item = this.uiHash.item,
-        beforeSelect,
-        beforeSelectUI,
-        beforeSelectPropagationStopped = true,
-        select,
-        selectUI,
-        selectPropagationStopped = true,
-        suggestInstance = this.suggestCreate();
-
-    suggestInstance._focused = item;
-    this.suggestElement
-        .on('suggestbeforeselect', function(e, ui) {
-            beforeSelect = true;
-            beforeSelectUI = ui;
-        })
-        .on('suggestselect', function(e, ui) {
-            select = true;
-            selectUI = ui;
-        })
-        .parent()
-        .on('suggestbeforeselect', function() {
-            beforeSelectPropagationStopped = false;
-        })
-        .on('suggestselect', function() {
-            selectPropagationStopped = false;
-        });
-
-    suggestInstance._onSelectItem($.Event('select'));
-
-    assertTrue(beforeSelect);
-    assertTrue(select);
-    assertFalse(beforeSelectPropagationStopped);
-    assertFalse(selectPropagationStopped);
-    assertEquals(beforeSelectUI.item, item);
-    assertEquals(selectUI.item, item);
-
-    beforeSelect = select = beforeSelectUI = selectUI = null;
-    beforeSelectPropagationStopped = selectPropagationStopped = true;
-
-    this.suggestElement
-        .on('suggestbeforeselect.returnfalse', function(e, ui) {
-            return false;
-        });
-
-    suggestInstance._focused = item;
-    suggestInstance._onSelectItem($.Event('select'));
-    assertTrue(beforeSelect);
-    assertNull(select);
-    assertTrue(beforeSelectPropagationStopped);
-    assertTrue(selectPropagationStopped);
-    assertEquals(beforeSelectUI.item, item);
-    assertNull(selectUI);
-
-    beforeSelect = select = beforeSelectUI = selectUI = null;
-    beforeSelectPropagationStopped = selectPropagationStopped = true;
-
-    this.suggestElement
-        .off('suggestbeforeselect.returnfalse')
-        .on('suggestselect.returnfalse', function() {
-            return false;
-        });
-
-    suggestInstance._focused = item;
-    suggestInstance._onSelectItem($.Event('select'));
-    assertTrue(beforeSelect);
-    assertTrue(select);
-    assertFalse(beforeSelectPropagationStopped);
-    assertTrue(selectPropagationStopped);
-    assertEquals(beforeSelectUI.item, item);
-    assertEquals(selectUI.item, item);
-
-    beforeSelect = select = beforeSelectUI = selectUI = null;
-    beforeSelectPropagationStopped = selectPropagationStopped = true;
-
-    this.suggestElement.off('suggestselect.returnfalse');
-    var event = $.Event('select');
-    event.target = this.suggestElement[0];
-
-    suggestInstance._onSelectItem(event, item);
-    assertEquals(suggestInstance._selectedItem, item);
-};
-SuggestTest.prototype.testSelectItem = function() {
-    var suggestInstance = this.suggestCreate();
-
-    suggestInstance._focused = suggestInstance._term = suggestInstance._selectedItem = null;
-    suggestInstance.valueField.val('');
-
-    suggestInstance._selectItem($.Event('select'));
-    assertNull(suggestInstance._selectedItem);
-    assertNull(suggestInstance._term);
-    assertEquals(suggestInstance.valueField.val(), '');
-
-    suggestInstance._focused = this.uiHash.item;
-
-    suggestInstance._selectItem($.Event('select'));
-    assertEquals(suggestInstance._selectedItem, suggestInstance._focused);
-    assertEquals(suggestInstance._term, suggestInstance._focused.label);
-    assertEquals(suggestInstance.valueField.val(), suggestInstance._focused.id);
-    assertTrue(suggestInstance.dropdown.is(':hidden'));
-
-    this.suggestDestroy();
-
-    var suggestOptions;
-    if(window.localStorage) {
-        suggestOptions = {
-            showRecent: true,
-            storageKey: 'jsTestDriver-test-suggest-recent'
-        };
-        suggestInstance = this.suggestCreate(suggestOptions);
-        suggestInstance._focused = this.uiHash.item;
-
-        suggestInstance._selectItem($.Event('select'));
-
-        var storedItem = localStorage.getItem(suggestOptions.storageKey);
-        assertEquals(storedItem, JSON.stringify([this.uiHash.item]));
-        localStorage.removeItem(suggestOptions.storageKey);
-    }
-};
-SuggestTest.prototype.testSelectItemMultiselect = function() {
-    var suggestInstance = this.suggestCreate({multiselect: true});
-
-    suggestInstance._focused = suggestInstance._term = suggestInstance._selectedItem = null;
-    suggestInstance.valueField.val('');
-
-    suggestInstance._selectItem($.Event('select'));
-    assertNull(suggestInstance._selectedItem);
-    assertNull(suggestInstance._term);
-    assertFalse(suggestInstance.valueField.find('option').length > 0);
-    assertTrue(suggestInstance.dropdown.is(':hidden'));
-
-    suggestInstance._focused = this.uiHash.item;
-    var selectedElement = jQuery('<div></div>');
-    var event = $.Event('select');
-    event.target = selectedElement[0];
-
-    suggestInstance._selectItem(event);
-    assertEquals(suggestInstance._selectedItem, suggestInstance._focused);
-    assertEquals(suggestInstance._term, '');
-    assertTrue(suggestInstance._getOption(suggestInstance._focused).length > 0);
-    assertTrue(selectedElement.hasClass(suggestInstance.options.selectedClass));
-    assertTrue(suggestInstance.dropdown.is(':hidden'));
-
-    suggestInstance._selectItem(event);
-    assertEquals(suggestInstance._selectedItem, suggestInstance._nonSelectedItem);
-    assertFalse(suggestInstance._getOption(suggestInstance._focused).length > 0);
-    assertFalse(selectedElement.hasClass(suggestInstance.options.selectedClass));
-    assertTrue(suggestInstance.dropdown.is(':hidden'));
-};
-SuggestTest.prototype.testResetSuggestValue = function() {
-    var suggestInstance = this.suggestCreate();
-    suggestInstance.valueField.val('test');
-    suggestInstance._resetSuggestValue();
-    assertEquals(suggestInstance.valueField.val(), suggestInstance._nonSelectedItem.id);
-};
-SuggestTest.prototype.testResetSuggestValueMultiselect = function() {
-    var suggestInstance = this.suggestCreate({multiselect: true});
-    suggestInstance._focused = this.uiHash.item;
-    var selectedElement = jQuery('<div></div>');
-    var event = $.Event('select');
-    event.target = selectedElement[0];
-
-    suggestInstance._selectItem(event);
-    suggestInstance._resetSuggestValue();
-
-    var suggestValue = suggestInstance.valueField.val();
-    assertArray(suggestValue);
-    assertNotUndefined(suggestValue[0]);
-    assertEquals(suggestValue[0], this.uiHash.item.id);
-};
-SuggestTest.prototype.testReadItemData = function() {
-    var testElement = jQuery('<div></div>'),
-        suggestInstance = this.suggestCreate();
-    assertEquals(suggestInstance._readItemData(testElement), suggestInstance._nonSelectedItem);
-    testElement.data('suggestOption', 'test');
-    assertEquals(suggestInstance._readItemData(testElement), 'test');
-};
-SuggestTest.prototype.testIsDropdownShown = function() {
-    var suggestInstance = this.suggestCreate();
-    suggestInstance.dropdown.hide();
-    assertFalse(suggestInstance.isDropdownShown());
-    suggestInstance.dropdown.show();
-    assertTrue(suggestInstance.isDropdownShown());
-};
-SuggestTest.prototype.testOpen = function() {
-    var openTriggered = false,
-        suggestInstance = this.suggestCreate();
-
-    this.suggestElement.on('suggestopen', function() {
-        openTriggered = true;
-    });
-
-    suggestInstance.dropdown.show();
-    suggestInstance.open($.Event('open'));
-    assertFalse(openTriggered);
-
-    suggestInstance.dropdown.hide();
-    suggestInstance.open($.Event('open'));
-    assertTrue(openTriggered);
-    assertTrue(suggestInstance.dropdown.is(':visible'));
-};
-SuggestTest.prototype.testClose = function() {
-    var closeTriggered = false,
-        suggestInstance = this.suggestCreate();
-
-    suggestInstance.element.val('test');
-    suggestInstance._renderedContext = 'test';
-    suggestInstance.dropdown.show().append('<div class="test"></div>');
-
-    this.suggestElement.on('suggestclose', function() {
-        closeTriggered = true;
-    });
-
-    suggestInstance.close($.Event('close'));
-    assertNull(suggestInstance._renderedContext);
-    assertTrue(suggestInstance.dropdown.is(':hidden'));
-    assertFalse(suggestInstance.dropdown.children().length > 0);
-    assertTrue(closeTriggered);
-};
-SuggestTest.prototype.testSetTemplate = function() {
-    /*:DOC += <script type="text/template" id="test-template"><div><%= data.test %></div></script>*/
-    var suggestInstance = this.suggestCreate({template: '<div><%= data.test %></div>'}),
-        tmpl,
-        html;
-
-    tmpl = suggestInstance.templates[suggestInstance.templateName]
-
-    html = jQuery('<div />').append(tmpl({
-        data: {
-            test: 'test'
-        }
-    })).html();
-
-    assertEquals(html, '<div>test</div>');
-
-    suggestInstance = this.suggestCreate({
-        template: '#test-template'
-    });
-
-    tmpl = suggestInstance.templates[suggestInstance.templateName];
-
-    html = jQuery('<div />').append(tmpl({
-        data: {
-            test: 'test'
-        }
-    })).html();
-
-    assertEquals(html, '<div>test</div>');
-};
-SuggestTest.prototype.testSearch = function() {
-    var searchTriggered = false,
-        seachPropagationStopped = true,
-        suggestInstance = this.suggestCreate();
-
-    this.suggestElement
-        .on('suggestsearch', function() {
-            searchTriggered = true;
-        })
-        .parent()
-        .on('suggestsearch', function() {
-            seachPropagationStopped = false;
-        });
-
-    suggestInstance._term = suggestInstance._value();
-    suggestInstance._selectedItem = null;
-
-    suggestInstance.preventBlur = true;
-    suggestInstance.search($.Event('search'));
-
-    assertNull(suggestInstance._selectedItem);
-    assertFalse(searchTriggered);
-    suggestInstance.preventBlur = false;
-
-    this.suggestElement.val('test');
-    suggestInstance.search($.Event('search'));
-
-    assertEquals(suggestInstance._term, suggestInstance._value());
-    assertTrue(searchTriggered);
-    assertFalse(seachPropagationStopped);
-
-    searchTriggered = false;
-    seachPropagationStopped = true;
-    suggestInstance._selectedItem = null;
-    suggestInstance.options.minLength = 10;
-    this.suggestElement.val('testtest');
-
-    suggestInstance.search($.Event('search'));
-
-    assertEquals(suggestInstance._selectedItem, suggestInstance._nonSelectedItem);
-    assertEquals(suggestInstance.valueField.val(), suggestInstance._selectedItem.id);
-    assertFalse(searchTriggered);
-
-    searchTriggered = false;
-    seachPropagationStopped = true;
-    suggestInstance._selectedItem = null;
-    suggestInstance.options.minLength = 1;
-    this.suggestElement.val('test');
-
-    this.suggestElement
-        .on('suggestsearch.returnfalse', function() {
-            return false;
-        });
-
-    suggestInstance.search($.Event('search'));
-
-    assertEquals(suggestInstance._term, suggestInstance._value());
-    assertTrue(searchTriggered);
-    assertTrue(seachPropagationStopped);
-};
-SuggestTest.prototype.testUderscoreSearch = function() {
-    var sourceLaunched = false,
-        sorceTerm = null,
-        responceExists = false,
-        suggestOptions = {
-            source: function(term, response){
-                sourceLaunched = true;
-                sorceTerm = term;
-                responceExists = (response && jQuery.type(response) === 'function');
-            },
-            delay: null
-        },
-        suggestInstance = this.suggestCreate(suggestOptions);
-
-    suggestInstance._search($.Event('search'), 'test', {});
-    assertTrue(sourceLaunched);
-    assertEquals(sorceTerm, 'test');
-    assertTrue(responceExists);
-    assertTrue(this.suggestElement.hasClass(suggestInstance.options.loadingClass));
-    assertUndefined(suggestInstance._searchTimeout);
-
-    suggestInstance.options.delay = 100;
-    suggestInstance._search($.Event('search'), 'test', {});
-    assertNotUndefined(suggestInstance._searchTimeout);
-};
-SuggestTest.prototype.testPrepareDropdownContext = function() {
-    var suggestInstance = this.suggestCreate();
-
-    suggestInstance._items = [this.uiHash.item];
-    suggestInstance._term = 'test';
-    suggestInstance._selectedItem = this.uiHash.item;
-
-    var context = suggestInstance._prepareDropdownContext({});
-
-    assertEquals(context.items, suggestInstance._items);
-    assertEquals(context.term, suggestInstance._term);
-    assertEquals(context.optionData(this.uiHash.item),
-        'data-suggest-option="' + JSON.stringify(this.uiHash.item).replace(/"/g, '&quot;') + '"');
-    assertTrue(context.itemSelected(this.uiHash.item));
-    assertNotUndefined(context.noRecordsText);
-    assertFalse(context.recentShown());
-    assertNotUndefined(context.recentTitle);
-    assertNotUndefined(context.showAllTitle);
-    assertFalse(context.allShown());
-};
-SuggestTest.prototype.testIsItemSelected = function() {
-    var suggestInstance = this.suggestCreate();
-    assertFalse(suggestInstance._isItemSelected(this.uiHash.item));
-    suggestInstance._selectedItem = this.uiHash.item;
-    assertTrue(suggestInstance._isItemSelected(this.uiHash.item));
-    this.suggestDestroy();
-
-    suggestInstance = this.suggestCreate({multiselect: true});
-    assertFalse(suggestInstance._isItemSelected(this.uiHash.item));
-    suggestInstance.valueField.append('<option value="1">Test Label1</option>');
-    assertTrue(suggestInstance._isItemSelected(this.uiHash.item));
-};
-SuggestTest.prototype.testRenderDropdown = function() {
-    var testContext = {
-            test: 'test'
-        },
-        contentUpdatedTriggered = false,
-        suggestOptions = {
-            template: '<div><%= data.test %></div>'
-        },
-        suggestInstance = this.suggestCreate(suggestOptions);
-
-    suggestInstance.dropdown.on('contentUpdated', function() {
-        contentUpdatedTriggered = true;
-    });
-    suggestInstance.element.addClass(suggestInstance.options.loadingClass);
-
-    suggestInstance._renderDropdown(null, [this.uiHash.item], testContext);
-
-    assertEquals(suggestInstance._items, [this.uiHash.item]);
-    assertEquals(suggestInstance.dropdown.html(), '<div>test</div>');
-    assertTrue(contentUpdatedTriggered);
-    assertEquals(suggestInstance._renderedContext, suggestInstance._prepareDropdownContext(testContext));
-    assertFalse(suggestInstance.element.hasClass(suggestInstance.options.loadingClass));
-    assertTrue(suggestInstance.dropdown.is(':visible'));
-};
-SuggestTest.prototype.testProcessResponse = function() {
-    var testContext = {
-            test: 'test'
-        },
-        responseTriggered = false,
-        suggestOptions = {
-            template: '<div><%= data.test %></div>'
-        },
-        responcePropagationStopped = true,
-        rendererExists,
-        responseData,
-        suggestInstance = this.suggestCreate(suggestOptions);
-
-    this.suggestElement
-        .on('suggestresponse', function(e, data, renderer) {
-            responseTriggered = true;
-            rendererExists = (renderer && jQuery.type(renderer) === 'function');
-            responseData = data;
-        })
-        .parent()
-        .on('suggestresponse', function() {
-            responcePropagationStopped = false;
-        });
-    suggestInstance._processResponse($.Event('response'), [this.uiHash.item], testContext);
-
-    assertTrue(responseTriggered);
-    assertTrue(rendererExists);
-    assertEquals(responseData, [this.uiHash.item]);
-    assertFalse(responcePropagationStopped);
-    assertEquals(suggestInstance.dropdown.html(), '<div>test</div>');
-
-    suggestInstance.dropdown.empty();
-    this.suggestElement
-        .on('suggestresponse.returnfalse', function() {
-            return false;
-        });
-    responcePropagationStopped = true;
-
-    suggestInstance._processResponse($.Event('response'), [this.uiHash.item], testContext);
-
-    assertTrue(responcePropagationStopped);
-    assertFalse(suggestInstance.dropdown.children().tength > 0);
-};
-SuggestTest.prototype.testSource = function() {
-    var sourceArray = [this.uiHash.item],
-        sourceUrl = 'www.test.url',
-        sourceFuncExecuted = false,
-        responseExecuted = false,
-        responseItems = null,
-        sourceFuncTerm = "",
-        sourceFuncResponse = null,
-        ajaxData = '',
-        ajaxUrl = '',
-        sourceFunc = function(term, response) {
-            sourceFuncExecuted = true;
-            sourceFuncTerm = term;
-            sourceFuncResponse = (response && jQuery.type(response) === 'function');
-        },
-        response = function (items) {
-            responseExecuted = true;
-            responseItems = items;
-        };
-
-    var suggestInstance = this.suggestCreate({
-        source: sourceArray
-    });
-
-    suggestInstance._source('test', response);
-
-    assertTrue(responseExecuted);
-    assertEquals(responseItems, sourceArray);
-    this.suggestDestroy();
-
-    responseExecuted = false;
-    responseItems = null;
-
-    suggestInstance = this.suggestCreate({
-        source: sourceUrl,
-        ajaxOptions: {
-            beforeSend: function(xhr, settings) {
-                xhr.abort();
-                ajaxData = settings.data;
-                ajaxUrl = settings.url;
-                settings.success(sourceArray);
-            }
-        },
-        termAjaxArgument: 'test'
-    });
-    suggestInstance._source('test', response);
-
-    assertTrue(responseExecuted);
-    assertEquals(responseItems, sourceArray);
-    assertEquals(ajaxData, 'test=test');
-    assertEquals(ajaxUrl, sourceUrl);
-    this.suggestDestroy();
-
-    responseExecuted = false;
-    responseItems = null;
-
-    suggestInstance = this.suggestCreate({
-        source: sourceFunc
-    });
-    suggestInstance._source('test', response);
-
-    assertTrue(sourceFuncExecuted);
-    assertEquals(sourceFuncTerm, 'test');
-    assertTrue(sourceFuncResponse);
-};
-SuggestTest.prototype.testAbortSearch = function() {
-    var searchAborted = false,
-        suggestInstance = this.suggestCreate();
-
-    this.suggestElement.addClass(suggestInstance.options.loadingClass);
-    suggestInstance._xhr = {
-        abort: function() {
-            searchAborted = true;
-        }
-    };
-
-    suggestInstance._abortSearch();
-
-    assertFalse(this.suggestElement.hasClass(suggestInstance.options.loadingClass));
-    assertTrue(searchAborted);
-};
-SuggestTest.prototype.testShowAll = function() {
-    var searchAborted,
-        showAllTerm,
-        showAllContext,
-        suggestInstance = this.suggestCreate();
-    suggestInstance._abortSearch = function() {
-        searchAborted = true;
-    };
-    suggestInstance._search = function(e, term, context) {
-        showAllTerm = term;
-        showAllContext = context;
-    };
-
-    suggestInstance._showAll(jQuery.Event('showAll'));
-
-    assertTrue(searchAborted);
-    assertEquals(showAllTerm, '');
-    assertEquals(showAllContext, {_allShown: true});
-};
-SuggestTest.prototype.testAddRecent = function() {
-    var recentItems = [
-            {id: 2, label: 'Test Label 2'},
-            {id: 3, label: 'Test Label 3'}
-        ],
-        suggestInstance = this.suggestCreate();
-
-    suggestInstance._recentItems = recentItems;
-    suggestInstance.options.storageKey = 'jsTestDriver-test-suggest-recent';
-    suggestInstance._addRecent(this.uiHash.item);
-
-    recentItems.unshift(this.uiHash.item);
-    assertEquals(recentItems, suggestInstance._recentItems);
-    if(window.localStorage) {
-        assertEquals(localStorage.getItem(suggestInstance.options.storageKey), JSON.stringify(recentItems));
-    }
-
-    suggestInstance._addRecent(this.uiHash.item);
-    assertEquals(recentItems, suggestInstance._recentItems);
-    if(window.localStorage) {
-        assertEquals(localStorage.getItem(suggestInstance.options.storageKey), JSON.stringify(recentItems));
-    }
-
-    suggestInstance.options.storageLimit = 1;
-    var newRecentItem = {id: 4, label: 'Test Label 4'};
-    suggestInstance._addRecent(newRecentItem);
-
-    assertEquals([newRecentItem], suggestInstance._recentItems);
-    if(window.localStorage) {
-        assertEquals(localStorage.getItem(suggestInstance.options.storageKey), JSON.stringify([newRecentItem]));
-        localStorage.removeItem(suggestInstance.options.storageKey);
-    }
-};
-SuggestTest.prototype.testRenderMultiselect = function() {
-    var suggestOptions = {
-            multiselect: true,
-            multiSuggestWrapper: '<div id="test-multisuggest-wrapper" data-role="parent-choice-element"></div>'
-        },
-        suggestInstance = this.suggestCreate(suggestOptions);
-
-    assertTrue(this.suggestElement.closest('[data-role="parent-choice-element"]').is('#test-multisuggest-wrapper'));
-    assertTrue(suggestInstance.elementWrapper.is('#test-multisuggest-wrapper'));
-};
-SuggestTest.prototype.testGetOptions = function() {
-    var suggestInstance = this.suggestCreate();
-
-    assertFalse(suggestInstance._getOptions().length > 0);
-
-    var option = jQuery('<option></option>');
-    suggestInstance.valueField.append(option);
-    assertTrue(suggestInstance._getOptions().is(option));
-};
-SuggestTest.prototype.testFilterSelected = function() {
-    var items = [this.uiHash.item, {id: 2, label: 'Test Label2'}],
-        suggestInstance = this.suggestCreate();
-
-    suggestInstance.valueField.append('<option value="2">Test Label2</option>');
-    assertEquals(suggestInstance._filterSelected(items), [this.uiHash.item]);
-};
-SuggestTest.prototype.testCreateOption = function() {
-    var suggestInstance = this.suggestCreate();
-
-    var option = suggestInstance._createOption(this.uiHash.item);
-    assertEquals(option.val(), "1");
-    assertEquals(option.prop('selected'), true);
-    assertEquals(option.text(), "Test Label");
-    assertNotUndefined(option.data('renderedOption'));
-};
-SuggestTest.prototype.testAddOption = function() {
-    var selectTarget = jQuery('<div />'),
-        event = jQuery.Event('add'),
-        suggestInstance = this.suggestCreate();
-
-    event.target = selectTarget[0];
-    suggestInstance._addOption(event, this.uiHash.item);
-
-    var option = suggestInstance.valueField.find('option[value=' + this.uiHash.item.id + ']');
-    assertTrue(option.length > 0);
-    assertTrue(option.data('selectTarget').is(selectTarget));
-};
-SuggestTest.prototype.testGetOption = function() {
-    var suggestInstance = this.suggestCreate();
-
-    assertFalse(suggestInstance._getOption(this.uiHash.item).length > 0);
-
-    var option = jQuery('<option value="1">Test Label</option>');
-    suggestInstance.valueField.append(option);
-    assertTrue(suggestInstance._getOption(this.uiHash.item).length > 0);
-    assertTrue(suggestInstance._getOption(option).length > 0);
-};
-SuggestTest.prototype.testRemoveLastAdded = function() {
-    var suggestInstance = this.suggestCreate({multiselect: true});
-
-    suggestInstance._addOption({}, this.uiHash.item);
-    assertTrue(suggestInstance.valueField.find('option').length > 0);
-    suggestInstance._removeLastAdded();
-    assertFalse(suggestInstance.valueField.find('option').length > 0);
-};
-SuggestTest.prototype.testRemoveOption = function() {
-    var selectTarget = jQuery('<div />'),
-        event = jQuery.Event('select'),
-        suggestInstance = this.suggestCreate({multiselect: true});
-
-    selectTarget.addClass(suggestInstance.options.selectedClass);
-    event.target = selectTarget[0];
-
-    suggestInstance._addOption(event, this.uiHash.item);
-    assertTrue(suggestInstance.valueField.find('option').length > 0);
-    suggestInstance.removeOption(event, this.uiHash.item);
-    assertFalse(suggestInstance.valueField.find('option').length > 0);
-    assertFalse(selectTarget.hasClass(suggestInstance.options.selectedClass));
-};
-SuggestTest.prototype.testRenderOption = function() {
-    var suggestInstance = this.suggestCreate(),
-        choiceTmpl;
-
-    suggestInstance.elementWrapper = jQuery('<div />').appendTo('body');
-
-    choiceTmpl = mageTemplate(suggestInstance.options.choiceTemplate, {
-        text: this.uiHash.item.label
-    });
-
-    var testOption = jQuery(choiceTmpl),
-        option = suggestInstance._renderOption(this.uiHash.item);
-
-    assertTrue(option.next().is(suggestInstance.elementWrapper));
-    assertEquals(jQuery('<div />').append(testOption).html(), jQuery('<div />').append(option).html());
-};
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/suggest/tree-suggest-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/suggest/tree-suggest-test.js
deleted file mode 100644
index 2a63c6953ef87c493357894a38a1643509dd5751..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/suggest/tree-suggest-test.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-TreeSuggestTest = TestCase('TreeSuggestTest');
-TreeSuggestTest.prototype.setUp = function() {
-    /*:DOC += <input name="test-suggest" id="tree-suggest" />*/
-    this.suggestElement = jQuery('#tree-suggest');
-};
-TreeSuggestTest.prototype.tearDown = function() {
-    this.treeSuggestDestroy();
-};
-TreeSuggestTest.prototype.treeSuggestDestroy = function() {
-    if(this.suggestElement.data('treeSuggest')) {
-        this.suggestElement.treeSuggest('destroy');
-    }
-};
-TreeSuggestTest.prototype.treeSuggestCreate = function(options, element) {
-    return (element || this.suggestElement).treeSuggest(options || {} ).data('treeSuggest');
-};
-TreeSuggestTest.prototype.uiHash = {
-    item: {
-        id: 1,
-        label: 'Test Label'
-    }
-};
-TreeSuggestTest.prototype.stub = function(instance, methodName, retVal) {
-    var d = $.Deferred();
-    if(instance && instance[methodName]) {
-        instance[methodName] = function() {
-            d.resolve(arguments);
-            if(retVal) {
-                return retVal;
-            }
-        };
-    }
-    return d.promise();
-};
-
-TreeSuggestTest.prototype.testInit = function() {
-    var treeSuggestInstance = this.treeSuggestCreate();
-    assertTrue(this.suggestElement.is(':mage-treeSuggest'));
-    assertEquals(treeSuggestInstance.widgetEventPrefix, 'suggest');
-};
-
-TreeSuggestTest.prototype.testClose = function() {
-    var treeSuggestInstance = this.treeSuggestCreate(),
-        elementFocused = false;
-    treeSuggestInstance.element.on('focus', function() {
-        elementFocused = true;
-    });
-    treeSuggestInstance.dropdown.text('test').show();
-    treeSuggestInstance.close();
-    assertEquals(treeSuggestInstance.dropdown.text(), '');
-    assertTrue(treeSuggestInstance.dropdown.is(':hidden'));
-
-    treeSuggestInstance.dropdown.text('test').show();
-    treeSuggestInstance.close(jQuery.Event('select'));
-    assertEquals(treeSuggestInstance.dropdown.text(), '');
-    assertTrue(treeSuggestInstance.dropdown.is(':hidden'));
-
-    treeSuggestInstance.dropdown.text('test').show();
-    treeSuggestInstance.close(jQuery.Event('select_tree_node'));
-    assertEquals(treeSuggestInstance.dropdown.text(), 'test');
-    assertTrue(treeSuggestInstance.dropdown.is(':visible'));
-};
-TreeSuggestTest.prototype.testFilterSelected = function() {
-    var treeSuggestInstance = this.treeSuggestCreate();
-    assertEquals(treeSuggestInstance._filterSelected([this.uiHash.item], {_allShown: true}), [this.uiHash.item]);
-};
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/tabs/index.html b/dev/tests/js/JsTestDriver/testsuite/mage/tabs/index.html
deleted file mode 100644
index 30c29e38cc102f4bfe16d76c8c4b1bbf3f73b4c0..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/tabs/index.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!--
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-<!DOCTYPE html>
-<html>
-<head>
-    <meta charset="utf-8">
-    <title>Tabs Widget: QUnit Tests </title>
-    <base href="../../../"/>
-    <link type="text/css" rel="stylesheet" href="framework/qunit/qunit-1.14.0.css"/>
-    <script type="text/javascript" src="../../../pub/lib/jquery.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/jquery/jquery-ui.js"></script>
-    <script type="text/javascript" src="framework/qunit/qunit-1.14.0.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/mage.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/tabs.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/collapsible.js"></script>
-    <script type="text/javascript" src="testsuite/mage/tabs/tabs.js"></script>
-</head>
-<body>
-<div id="qunit"></div>
-<div id="qunit-fixture">
-</div>
-</body>
-</html>
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/tabs/tabs-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/tabs/tabs-test.js
deleted file mode 100644
index 7129357159f9f8f66022eaa96a39a616a7d5c743..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/tabs/tabs-test.js
+++ /dev/null
@@ -1,203 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-TabsTest = TestCase('TabsTest');
-TabsTest.prototype.testInit = function() {
-    /*:DOC += <div id="tabs"></div>*/
-    var tabs = jQuery('#tabs').tabs();
-    assertTrue(tabs.is(':mage-tabs'));
-};
-
-TabsTest.prototype.testCreate = function() {
-    /*:DOC += <div id="tabs"><ul>
-        <li>
-            <a href="#tab1_content" id="tab1"></a>
-            <div id="tab1_content"></div>
-        </li>
-     <li>
-        <a href="#tab2_content" id="tab2"></a>
-        <div id="tab2_content"></div>
-     </li>
-    </ul></div>*/
-    var tabs = jQuery('#tabs').tabs({active: 'tab2'});
-    assertEquals(tabs.tabs('option', 'active'), tabs.data("tabs").anchors.index(jQuery('#tab2')));
-};
-
-TabsTest.prototype.testActiveAnchor = function() {
-    /*:DOC += <div id="tabs"><ul>
-         <li>
-            <a href="#tab1_content" id="tab1"></a>
-            <div id="tab1_content"></div>
-         </li>
-         <li>
-            <a href="#tab2_content" id="tab2"></a>
-            <div id="tab2_content"></div>
-         </li>
-     </ul></div>*/
-    var tabs = jQuery('#tabs').tabs({active: 'tab2'});
-    assertTrue(tabs.tabs('activeAnchor').is(tabs.data("tabs").anchors.eq(tabs.tabs('option', 'active'))));
-};
-
-TabsTest.prototype.testGetTabIndex = function() {
-    /*:DOC += <div id="tabs"><ul>
-         <li>
-             <a href="#tab1_content" id="tab1"></a>
-             <div id="tab1_content"></div>
-         </li>
-         <li>
-             <a href="#tab2_content" id="tab2"></a>
-             <div id="tab2_content"></div>
-         </li>
-     </ul></div>*/
-    var tabs = jQuery('#tabs').tabs();
-    assertEquals(0, tabs.data("tabs")._getTabIndex('tab1'));
-    assertEquals(1, tabs.data("tabs")._getTabIndex('tab2'));
-};
-
-TabsTest.prototype.testGetPanelForTab = function() {
-    /*:DOC += <div id="tabs"><ul>
-         <li>
-             <a href="#tab1_content" id="tab1"></a>
-         </li>
-     </ul></div>
-     <div id="destination">
-        <div id="tab1_content"></div>
-     </div>*/
-    var tabs = jQuery('#tabs').tabs({destination: '#destination'});
-    assertTrue(jQuery(tabs.data("tabs")._getPanelForTab(jQuery('#tab1').closest('li'))).is('#tab1_content'));
-};
-
-TabsTest.prototype.testMovePanelsInDestination = function() {
-    /*:DOC += <div id="tabs"><ul>
-         <li>
-            <a href="#tab1_content" id="tab1"></a>
-            <div id="tab1_content"></div>
-         </li>
-     </ul></div>
-     <div id="destination">
-     </div>*/
-    var tabs = jQuery('#tabs').tabs({destination: '#destination'});
-    var panel = jQuery('#tab1_content');
-    tabs.append(panel);
-    assertTrue(panel.parents('#tabs').length > 0);
-    assertEquals(panel.parents(tabs.tabs('option', 'destination')).length, 0);
-
-    tabs.data("tabs")._movePanelsInDestination(panel);
-    assertEquals(panel.parents('#tabs').length, 0);
-    assertTrue(panel.parents(tabs.tabs('option', 'destination')).length > 0);
-
-    tabs.tabs('option', 'destination', null);
-    tabs.append(panel);
-    assertTrue(panel.parents('#tabs').length > 0);
-
-    tabs.data("tabs")._movePanelsInDestination(panel);
-    assertTrue(panel.parents('#tabs').length > 0);
-};
-
-TabsTest.prototype.testAjaxLoad = function() {
-    /*:DOC += <div id="tabs"><ul>
-         <li>
-             <a href="www.site.com" id="tab1">Tab 1</a>
-             <div id="tab1_content"></div>
-         </li>
-     </ul></div>
-     */
-    var tabs = jQuery('#tabs').tabs(),
-        ui = {
-            tab: jQuery('#tab1'),
-            panel: jQuery('#tab1_content')
-        };
-    tabs.tabs('option', 'load')({}, ui);
-    assertEquals(jQuery('#tab1').attr('href'), '#tab1_content');
-};
-
-TabsTest.prototype.testOnContentChange = function() {
-    /*:DOC += <div id="tabs"><ul>
-         <li>
-             <a href="www.site.com" id="tab1">Tab 1</a>
-             <div id="tab1_content"></div>
-         </li>
-     </ul></div>
-     */
-    var eventMock = {
-            data: {
-                index: 0
-            }
-        },
-        tabs = jQuery('#tabs').tabs();
-
-    tabs.data("tabs")._onContentChange(eventMock);
-    assertTrue(jQuery('#tab1').hasClass('_changed'));
-};
-
-TabsTest.prototype.testOnFocus = function() {
-    /*:DOC += <div id="tabs"><ul>
-         <li>
-             <a href="#tab1_content" id="tab1"></a>
-             <div id="tab1_content"></div>
-         </li>
-         <li>
-             <a href="#tab2_content" id="tab2"></a>
-             <div id="tab2_content"><input /></div>
-         </li>
-     </ul></div>
-     */
-    var eventMock = {
-            data: {
-                index: 1
-            }
-        },
-        tabs = jQuery('#tabs').tabs();
-
-    assertNotEquals(tabs.tabs('option', '_active'), eventMock.data.index);
-
-    tabs.data("tabs")._onFocus(eventMock);
-    assertEquals(tabs.tabs('option', '_active'), eventMock.data.index);
-};
-
-TabsTest.prototype.testOnBeforeSubmit = function() {
-    /*:DOC += <div id="tabs"><ul>
-         <li>
-             <a href="#tab1_content" id="tab1"></a>
-             <div id="tab1_content"></div>
-         </li>
-     </ul></div>
-     */
-    var tabs = jQuery('#tabs').tabs({active: 'tab1'}),
-        data= {},
-        testData = {
-            action: {
-                args: {
-                    tab: 'tab1'
-                }
-            }
-        },
-        testDataTabArgument = {
-            action: {
-                args: {
-                    testtab: 'tab1'
-                }
-            }
-        },
-        tabPrefix = 'test-',
-        tabIdArgument = 'testtab';
-
-    tabs.data("tabs")._onBeforeSubmit({}, data);
-    assertEquals(data, testData);
-    data = {};
-
-    jQuery('#tab1').prop('id', 'test-tab1');
-    tabs.tabs('option', 'tabsBlockPrefix', tabPrefix);
-    tabs.data("tabs")._onBeforeSubmit({}, data);
-    assertEquals(data, testData);
-    tabs.tabs('option', 'tabsBlockPrefix', null);
-    jQuery('#test-tab1').prop('id', 'tab1');
-    data = {};
-
-    tabs.tabs('option', 'tabIdArgument', tabIdArgument);
-    tabs.data("tabs")._onBeforeSubmit({}, data);
-    assertEquals(data, testDataTabArgument);
-};
-
-
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/tabs/tabs.js b/dev/tests/js/JsTestDriver/testsuite/mage/tabs/tabs.js
deleted file mode 100644
index 582c55da344d35e5eff285466b29869024079c7a..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/tabs/tabs.js
+++ /dev/null
@@ -1,124 +0,0 @@
-/**
- * @category    mage.js
- * @package     test
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-
-/*
-
- */
-test( "Initialization", function() {
-    expect(2);
-    var tabs = $("<div></div>");
-    tabs.tabs();
-    ok( tabs.is(':mage-tabs'), "widget instantiated" );
-    tabs.tabs('destroy');
-    ok( !tabs.is(':mage-tabs'), "widget destroyed" );
-});
-
-test( "Collapsible instantiation", function() {
-    expect(2);
-    var tabs = $("<div></div>");
-    var title = $("<div></div>").attr("data-role","collapsible");
-    title.appendTo(tabs);
-    tabs.tabs();
-    ok( title.is(':mage-collapsible'), "widget instantiated" );
-    tabs.tabs('destroy');
-    ok( !title.is(':mage-collapsible'), "widget destroyed" );
-});
-
-test( "Tabs behavior - closing others tabs when one gets activated", function() {
-    expect(4);
-    var tabs = $('<div></div>');
-    var title1 = $('<div data-role="collapsible"></div>').appendTo(tabs);
-    var content1 = $('<div data-role="content"></div>').appendTo(tabs);
-    var title2 = $('<div data-role="collapsible"></div>').appendTo(tabs);
-    var content2 = $('<div data-role="content"></div>').appendTo(tabs);
-    tabs.appendTo("body");
-    tabs.tabs();
-    ok( content1.is(':visible'), "content visible" );
-    ok( content2.is(':hidden'), "content hidden" );
-    title2.trigger('click');
-    ok( content1.is(':hidden'), "content hidden" );
-    ok( content2.is(':visible'), "content visible" );
-    tabs.tabs('destroy');
-});
-
-test( "Testing enable,disable,activate,deactivate options", function() {
-    expect(6);
-    var tabs = $('<div></div>');
-    var title = $('<div data-role="collapsible"></div>').appendTo(tabs);
-    var content = $('<div data-role="content"></div>').appendTo(tabs);
-    tabs.appendTo("body");
-    tabs.tabs();
-    ok( content.is(':visible'), "content visible" );
-    tabs.tabs("deactivate",0);
-    ok( content.is(':hidden'), "content hidden" );
-    tabs.tabs("activate",0);
-    ok( content.is(':visible'), "content visible" );
-    tabs.tabs("disable",0);
-    ok( content.is(':hidden'), "content hidden" );
-    title.trigger("click");
-    ok( content.is(':hidden'), "content hidden" );
-    tabs.tabs("enable",0);
-    title.trigger("click");
-    ok( content.is(':visible'), "content visible" );
-    tabs.tabs('destroy');
-});
-
-asyncTest( "Keyboard support for tabs view", function() {
-
-    expect( 5 );
-    var tabs = $('<div></div>');
-    var title1 = $('<div data-role="collapsible"></div>').appendTo(tabs);
-    var content1 = $('<div data-role="content"></div>').appendTo(tabs);
-    var title2 = $('<div data-role="collapsible"></div>').appendTo(tabs);
-    var content2 = $('<div data-role="content"></div>').appendTo(tabs);
-    tabs.appendTo("body");
-    tabs.tabs();
-
-    title1.on("focus",function(ev){
-        ok(content1.is(':visible'), "Content is expanded");
-        title1.trigger($.Event( 'keydown', { keyCode: $.ui.keyCode.RIGHT } ));
-        ok(content2.is(':visible'), "Content is expanded");
-        ok(content1.is(':hidden'), "Content is collapsed");
-        title2.trigger($.Event( 'keydown', { keyCode: $.ui.keyCode.LEFT } ));
-        ok(content1.is(':visible'), "Content is expanded");
-        ok(content2.is(':hidden'), "Content is collapsed");
-        tabs.tabs('destroy');
-        start();
-    } );
-
-    setTimeout(function(){
-        title1.focus();
-    },10);
-});
-
-asyncTest( "Keyboard support for accordion view", function() {
-
-    expect( 5 );
-    var tabs = $('<div></div>');
-    var title1 = $('<div data-role="collapsible"></div>').appendTo(tabs);
-    var content1 = $('<div data-role="content"></div>').appendTo(tabs);
-    var title2 = $('<div data-role="collapsible"></div>').appendTo(tabs);
-    var content2 = $('<div data-role="content"></div>').appendTo(tabs);
-    tabs.appendTo("body");
-    tabs.tabs({openOnFocus:false});
-
-    title1.on("focus",function(ev){
-        ok(content1.is(':visible'), "Content is expanded");
-        title1.trigger($.Event( 'keydown', { keyCode: $.ui.keyCode.RIGHT } ));
-        ok(content1.is(':visible'), "Content is expanded");
-        ok(content2.is(':hidden'), "Content is collapsed");
-        title2.trigger($.Event( 'keydown', { keyCode: $.ui.keyCode.ENTER } ));
-        ok(content2.is(':visible'), "Content is expanded");
-        ok(content1.is(':hidden'), "Content is collapsed");
-        tabs.tabs('destroy');
-        start();
-    } );
-
-    setTimeout(function(){
-        title1.focus();
-    },10);
-});
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/translate/translate-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/translate/translate-test.js
deleted file mode 100644
index a9bbc7fb10d2d766403f0a65f97720816099fc33..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/translate/translate-test.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-TranslateTest = TestCase('TranslateTest');
-TranslateTest.prototype.testTranslateExist = function() {
-    assertNotUndefined(jQuery.mage.translate);
-};
-TranslateTest.prototype.testTranslationParametersOneArgument = function() {
-    jQuery.mage.translate.add('Hello World!');
-    assertEquals(
-        'Hello World!',
-        jQuery.mage.translate.translate('Hello World!'));
-};
-TranslateTest.prototype.testTranslationParametersArray = function() {
-    jQuery.mage.translate.add(['Hello World!', 'Bonjour tout le monde!']);
-    assertEquals(
-        'Hello World!',
-        jQuery.mage.translate.translate('Hello World!'));
-};
-TranslateTest.prototype.testTranslationParametersObject = function() {
-    var translation = {'Hello World!': 'Bonjour tout le monde!'};
-    jQuery.mage.translate.add(translation);
-    assertEquals(
-        translation['Hello World!'],
-        jQuery.mage.translate.translate('Hello World!'));
-
-    translation = {
-        'Hello World!': 'Hallo Welt!',
-        'Some text with symbols!-+"%#*': 'Ein Text mit Symbolen!-+"%#*'
-    };
-    jQuery.mage.translate.add(translation);
-    jQuery.each(translation, function(key) {
-        assertEquals(translation[key], jQuery.mage.translate.translate(key));
-    });
-};
-TranslateTest.prototype.testTranslationParametersTwoArguments = function() {
-    jQuery.mage.translate.add('Hello World!', 'Bonjour tout le monde!');
-    assertEquals(
-        'Bonjour tout le monde!',
-        jQuery.mage.translate.translate('Hello World!'));
-};
-TranslateTest.prototype.testTranslationAlias = function() {
-    var translation = {'Hello World!': 'Bonjour tout le monde!'};
-    jQuery.mage.translate.add(translation);
-    assertEquals(translation['Hello World!'], jQuery.mage.__('Hello World!'));
-};
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/translate_inline/translate-inline-test.js b/dev/tests/js/JsTestDriver/testsuite/mage/translate_inline/translate-inline-test.js
deleted file mode 100644
index 18a117f1913b11d32b965f6071e9ea39d19a5a9d..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/translate_inline/translate-inline-test.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-TranslateInlineTest = TestCase('TranslateInlineTest');
-TranslateInlineTest.prototype.testInit = function() {
-    /*:DOC += <script id="translate-form-template" type="text/x-magento-template">
-      </script>
-      <div data-role="translate-dialog"></div>
-     */
-    var translateInline = jQuery('[data-role="translate-dialog"]').translateInline();
-    assertTrue(translateInline.is(':mage-translateInline'));
-    translateInline.translateInline('destroy');
-};
-TranslateInlineTest.prototype.testDialogOpenOnEdit = function() {
-    /*:DOC += <script id="translate-form-template" type="text/x-magento-template">
-      </script>
-      <div data-role="translate-dialog"></div>
-     */
-    var options= {
-            dialog: {
-                id: 'dialog-id'
-            }
-        };
-    var translateInline = jQuery('[data-role="translate-dialog"]').translateInline(options),
-        isDialogHiddenOnInit = translateInline.is(':hidden');
-    translateInline.trigger('edit.editTrigger');
-    var dialogVisibleAfterTriggerEdit = translateInline.is(':visible');
-    assertTrue(isDialogHiddenOnInit);
-    assertTrue(dialogVisibleAfterTriggerEdit);
-    translateInline.translateInline('destroy');
-};
-TranslateInlineTest.prototype.testTranslationFormTemplate = function() {
-    /*:DOC += <script id="translate-form-template" type="text/x-magento-template">
-      <form id="<%= data.id %>"><%= data.newTemplateVariable %></form>
-      </script>
-      <div data-role="translate-dialog"></div>
-     */
-    var options = {
-            translateForm: {
-                data:{
-                    id: 'translate-form-id',
-                    newTemplateVariable: 'New Template Variable'
-                }
-            }
-        },
-        translateInline = jQuery('[data-role="translate-dialog"]').translateInline(options);
-    translateInline.trigger('edit.editTrigger');
-    var translateForm = jQuery('#' + options.translateForm.data.id);
-    assertTrue(translateForm.size() > 0);
-    assertEquals(translateForm.text(), options.translateForm.data.newTemplateVariable);
-    translateInline.translateInline('destroy');
-};
-// @TODO Need to be fixed to avoid errors on the bamboo server in context of MAGETWO-5085 ticket
-/*TranslateInlineTest.prototype._testTranslateFormSubmit = function() {
-    FORM_KEY = 'form_key';
-    var options = {
-            ajaxUrl: 'www.test.com',
-            area: 'test',
-            translateForm: {
-                template:'<form id="<%= data.id %>"><input name="test" value="test" /></form>',
-                data:{
-                    id: 'translate-form-id'
-                }
-            },
-            dialog: {
-                id: 'dialog-id',
-                buttons : [{
-                    'class': 'submit-button'
-                }]
-            }
-        },
-        translateInline = jQuery(document).translateInline(options),
-        submit = jQuery('.ui-dialog-buttonset .submit-button'),
-        ajaxParametersCorrect = false;
-
-    translateInline.trigger('edit.editTrigger');
-    var parameters = jQuery.param({area: options.area}) +
-        '&' + jQuery('#' + options.translateForm.data.id).serialize(),
-        dialog = jQuery('#' + options.dialog.id),
-        dialogVisibleOnAjaxSend = false,
-        dialogHiddenAfterAjaxComplete = false;
-    jQuery(document)
-        .on('ajaxSend', function(e, jqXHR, settings){
-            jqXHR.abort();
-            dialogVisibleOnAjaxSend = dialog.is(':visible');
-            ajaxParametersCorrect = settings.data.indexOf(parameters) >= 0;
-            jQuery(this).trigger('ajaxComplete');
-        });
-    submit.trigger('click');
-    assertEquals(true, dialogVisibleOnAjaxSend);
-    assertEquals(true, ajaxParametersCorrect);
-    assertEquals(true, dialog.is(':hidden'));
-    translateInline.translateInline('destroy');
-};*/
-TranslateInlineTest.prototype.testDestroy = function() {
-    /*:DOC += <script id="translate-form-template" type="text/x-magento-template">
-      <form id="<%= data.id %>"><%= data.newTemplateVariable %></form>
-      </script>
-      <div data-role="translate-dialog"></div>
-      <img id="edit-trigger-id">
-     */
-    var options = {
-            translateForm: {
-                data:{
-                    id: 'translate-form-id',
-                    newTemplateVariable: ''
-                }
-            }
-        },
-        translateInline = jQuery('[data-role="translate-dialog"]').translateInline(options),
-        editTrigger = jQuery('#edit-trigger-id').editTrigger(),
-        editTriggerCreated = editTrigger.size() && jQuery('#edit-trigger-id').is(':mage-editTrigger'),
-        editTriggerEventIsBound = false;
-
-    assertTrue(translateInline.is(':mage-translateInline'));
-    assertTrue(editTriggerCreated);
-    translateInline.on('edit.editTrigger', function(){editTriggerEventIsBound = true;});
-    translateInline.translateInline('destroy');
-    translateInline.trigger('edit.editTrigger');
-    assertFalse(translateInline.is(':mage-translateInline'));
-    assertFalse(editTriggerEventIsBound);
-};
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/validation/index.html b/dev/tests/js/JsTestDriver/testsuite/mage/validation/index.html
deleted file mode 100644
index 00661de6d8153a6780b3282a7198129298d3aa93..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/validation/index.html
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
-/**
- * @category    mage.validation
- * @package     test
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Validation</title>
-    <base href="../../../"/>
-    <link type="text/css" rel="stylesheet" href="framework/qunit/qunit-1.14.0.css"/>
-    <script type="text/javascript" src="framework/qunit/qunit-1.14.0.js"></script>
-    <script src="../../../lib/web/jquery.js"></script>
-
-    <script src="../../../lib/web/jquery/jquery-ui.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/mage.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/translate.js"></script>
-    <script src="../../../lib/web/jquery/jquery.validate.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/validation.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/validation/validation.js"></script>
-    <script type="text/javascript" src="../../../lib/web/mage/bootstrap.js"></script>
-    <script type="text/javascript" src="testsuite/mage/validation/test-validation.js"></script>
-
-
-</head>
-<body>
-<div id="qunit"></div>
-<div id="qunit-fixture">
-</div>
-</body>
-</html>
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/validation/test-validation.js b/dev/tests/js/JsTestDriver/testsuite/mage/validation/test-validation.js
deleted file mode 100644
index 602ba4b8d3e607841244e107d48f05d1468a3d3c..0000000000000000000000000000000000000000
--- a/dev/tests/js/JsTestDriver/testsuite/mage/validation/test-validation.js
+++ /dev/null
@@ -1,611 +0,0 @@
-/**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
-test( "testValidateNoHtmlTags", function() {
-    expect(4);
-    equal($.validator.methods['validate-no-html-tags'].call(this, ""),true);
-    equal($.validator.methods['validate-no-html-tags'].call(this, null),true);
-    equal($.validator.methods['validate-no-html-tags'].call(this, "abc"),true);
-    equal($.validator.methods['validate-no-html-tags'].call(this, "<div>abc</div>"),false);
-
-});
-
-test( "testAllowContainerClassName", function() {
-    expect(4);
-    var radio = $('<input type="radio" class="change-container-classname"/>');
-    radio.appendTo("#qunit-fixture");
-    equal($.validator.methods['allow-container-className'].call(this, radio[0]),true);
-    var checkbox = $('<input type="checkbox" class="change-container-classname"/>');
-    equal($.validator.methods['allow-container-className'].call(this, checkbox[0]),true);
-    var radio2 = $('<input type="radio"/>');
-    equal($.validator.methods['allow-container-className'].call(this, radio2[0]),false);
-    var checkbox2 = $('<input type="checkbox"/>');
-    equal($.validator.methods['allow-container-className'].call(this, checkbox2[0]),false);
-});
-
-test( "testValidateSelect", function() {
-    expect(5);
-    equal($.validator.methods['validate-select'].call(this, ""),false);
-    equal($.validator.methods['validate-select'].call(this, "none"),false);
-    equal($.validator.methods['validate-select'].call(this, null),false);
-    equal($.validator.methods['validate-select'].call(this, undefined),false);
-    equal($.validator.methods['validate-select'].call(this, "abc"),true);
-});
-
-test( "testValidateNotEmpty", function() {
-    expect(5);
-    ok(!$.validator.methods['validate-no-empty'].call(this, ""));
-    ok(!$.validator.methods['validate-no-empty'].call(this, null));
-    ok(!$.validator.methods['validate-no-empty'].call(this, undefined));
-    ok(!$.validator.methods['validate-no-empty'].call(this, "   "));
-    ok($.validator.methods['validate-no-empty'].call(this, "test"));
-});
-
-test( "testValidateStreet", function() {
-    expect(9);
-    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, ""),true);
-    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, null),true);
-    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, undefined),true);
-    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, "   "),true);
-    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, "abc   "),true);
-    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, " 123  "),true);
-    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, "  abc123 "),true);
-    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, "  !@# "),false);
-    equal($.validator.methods['validate-alphanum-with-spaces'].call(this, "  abc.123 "),false);
-});
-
-test( "testValidatePhoneStrict", function() {
-    expect(9);
-    equal($.validator.methods['validate-phoneStrict'].call(this, ""),true);
-    equal($.validator.methods['validate-phoneStrict'].call(this, null),true);
-    equal($.validator.methods['validate-phoneStrict'].call(this, undefined),true);
-    equal($.validator.methods['validate-phoneStrict'].call(this, "   "),false);
-    equal($.validator.methods['validate-phoneStrict'].call(this, "5121231234"),false);
-    equal($.validator.methods['validate-phoneStrict'].call(this, "512.123.1234"),false);
-    equal($.validator.methods['validate-phoneStrict'].call(this, "512-123-1234"),true);
-    equal($.validator.methods['validate-phoneStrict'].call(this, "(512)123-1234"),true);
-    equal($.validator.methods['validate-phoneStrict'].call(this, "(512) 123-1234"),true);
-});
-
-test( "testValidatePhoneLax", function() {
-    expect(11);
-    equal($.validator.methods['validate-phoneLax'].call(this, ""),true);
-    equal($.validator.methods['validate-phoneLax'].call(this, null),true);
-    equal($.validator.methods['validate-phoneLax'].call(this, undefined),true);
-    equal($.validator.methods['validate-phoneLax'].call(this, "   "),false);
-    equal($.validator.methods['validate-phoneLax'].call(this, "5121231234"),true);
-    equal($.validator.methods['validate-phoneLax'].call(this, "512.123.1234"),true);
-    equal($.validator.methods['validate-phoneLax'].call(this, "512-123-1234"),true);
-    equal($.validator.methods['validate-phoneLax'].call(this, "(512)123-1234"),true);
-    equal($.validator.methods['validate-phoneLax'].call(this, "(512) 123-1234"),true);
-    equal($.validator.methods['validate-phoneLax'].call(this, "(512)1231234"),true);
-    equal($.validator.methods['validate-phoneLax'].call(this, "(512)_123_1234"),false);
-});
-
-test( "testValidateFax", function() {
-    expect(9);
-    equal($.validator.methods['validate-fax'].call(this, ""),true);
-    equal($.validator.methods['validate-fax'].call(this, null),true);
-    equal($.validator.methods['validate-fax'].call(this, undefined),true);
-    equal($.validator.methods['validate-fax'].call(this, "   "),false);
-    equal($.validator.methods['validate-fax'].call(this, "5121231234"),false);
-    equal($.validator.methods['validate-fax'].call(this, "512.123.1234"),false);
-    equal($.validator.methods['validate-fax'].call(this, "512-123-1234"),true);
-    equal($.validator.methods['validate-fax'].call(this, "(512)123-1234"),true);
-    equal($.validator.methods['validate-fax'].call(this, "(512) 123-1234"),true);
-});
-
-test( "testValidateEmail", function() {
-    expect(11);
-    equal($.validator.methods['validate-email'].call(this, ""),true);
-    equal($.validator.methods['validate-email'].call(this, null),true);
-    equal($.validator.methods['validate-email'].call(this, undefined),true);
-    equal($.validator.methods['validate-email'].call(this, "   "),false);
-    equal($.validator.methods['validate-email'].call(this, "123@123.com"),true);
-    equal($.validator.methods['validate-email'].call(this, "abc@124.en"),true);
-    equal($.validator.methods['validate-email'].call(this, "abc@abc.commmmm"),true);
-    equal($.validator.methods['validate-email'].call(this, "abc.abc.abc@abc.commmmm"),true);
-    equal($.validator.methods['validate-email'].call(this, "abc.abc-abc@abc.commmmm"),true);
-    equal($.validator.methods['validate-email'].call(this, "abc.abc_abc@abc.commmmm"),true);
-    equal($.validator.methods['validate-email'].call(this, "abc.abc_abc@abc"),false);
-});
-
-test( "testValidateEmailSender", function() {
-    expect(10);
-    equal($.validator.methods['validate-emailSender'].call(this, ""),true);
-    equal($.validator.methods['validate-emailSender'].call(null),true);
-    equal($.validator.methods['validate-emailSender'].call(undefined),true);
-    equal($.validator.methods['validate-emailSender'].call("   "),true);
-    equal($.validator.methods['validate-emailSender'].call("123@123.com"),true);
-    equal($.validator.methods['validate-emailSender'].call("abc@124.en"),true);
-    equal($.validator.methods['validate-emailSender'].call("abc@abc.commmmm"),true);
-    equal($.validator.methods['validate-emailSender'].call("abc.abc.abc@abc.commmmm"),true);
-    equal($.validator.methods['validate-emailSender'].call("abc.abc-abc@abc.commmmm"),true);
-    equal($.validator.methods['validate-emailSender'].call("abc.abc_abc@abc.commmmm"),true);
-});
-
-test( "testValidatePassword", function() {
-    expect(9);
-    equal($.validator.methods['validate-password'].call(this, ""),true);
-    equal($.validator.methods['validate-password'].call(this, null),false);
-    equal($.validator.methods['validate-password'].call(this, undefined),false);
-    equal($.validator.methods['validate-password'].call(this, "   "),true);
-    equal($.validator.methods['validate-password'].call(this, "123@123.com"),true);
-    equal($.validator.methods['validate-password'].call(this, "abc"),false);
-    equal($.validator.methods['validate-password'].call(this, "abc       "),false);
-    equal($.validator.methods['validate-password'].call(this, "     abc      "),false);
-    equal($.validator.methods['validate-password'].call(this, "dddd"),false);
-});
-
-test( "testValidateAdminPassword", function() {
-    expect(9);
-    equal(true, $.validator.methods['validate-admin-password'].call(this, ""));
-    equal(false, $.validator.methods['validate-admin-password'].call(this, null));
-    equal(false, $.validator.methods['validate-admin-password'].call(this, undefined));
-    equal(true, $.validator.methods['validate-admin-password'].call(this, "   "));
-    equal(true, $.validator.methods['validate-admin-password'].call(this, "123@123.com"));
-    equal(false, $.validator.methods['validate-admin-password'].call(this, "abc"));
-    equal(false, $.validator.methods['validate-admin-password'].call(this, "abc       "));
-    equal(false, $.validator.methods['validate-admin-password'].call(this, "     abc      "));
-    equal(false, $.validator.methods['validate-admin-password'].call(this, "dddd"));
-});
-
-test( "testValidateUrl", function() {
-    expect(8);
-    equal(true, $.validator.methods['validate-url'].call(this, ""));
-    equal(true, $.validator.methods['validate-url'].call(this, null));
-    equal(true, $.validator.methods['validate-url'].call(this, undefined));
-    equal(false, $.validator.methods['validate-url'].call(this, "   "));
-    equal(true, $.validator.methods['validate-url'].call(this, "http://www.google.com"));
-    equal(true, $.validator.methods['validate-url'].call(this, "http://127.0.0.1:8080/index.php"));
-    equal(true, $.validator.methods['validate-url'].call(this, "http://app-spot.com/index.php"));
-    equal(true, $.validator.methods['validate-url'].call(this, "http://app-spot_space.com/index.php"));
-});
-
-test( "testValidateCleanUrl", function() {
-    expect(8);
-    equal(true, $.validator.methods['validate-clean-url'].call(this, ""));
-    equal(true, $.validator.methods['validate-clean-url'].call(this, null));
-    equal(true, $.validator.methods['validate-clean-url'].call(this, undefined));
-    equal(false, $.validator.methods['validate-clean-url'].call(this, "   "));
-    equal(true, $.validator.methods['validate-clean-url'].call(this, "http://www.google.com"));
-    equal(false, $.validator.methods['validate-clean-url'].call(this, "http://127.0.0.1:8080/index.php"));
-    equal(false, $.validator.methods['validate-clean-url'].call(this, "http://127.0.0.1:8080"));
-    equal(false, $.validator.methods['validate-clean-url'].call(this, "http://127.0.0.1"));
-});
-
-test( "testValidateXmlIdentifier", function() {
-    expect(8);
-    equal(true, $.validator.methods['validate-xml-identifier'].call(this, ""));
-    equal(true, $.validator.methods['validate-xml-identifier'].call(this, null));
-    equal(true, $.validator.methods['validate-xml-identifier'].call(this, undefined));
-    equal(false, $.validator.methods['validate-xml-identifier'].call(this, "   "));
-    equal(true, $.validator.methods['validate-xml-identifier'].call(this, "abc"));
-    equal(true, $.validator.methods['validate-xml-identifier'].call(this, "abc_123"));
-    equal(true, $.validator.methods['validate-xml-identifier'].call(this, "abc-123"));
-    equal(false, $.validator.methods['validate-xml-identifier'].call(this, "123-abc"));
-});
-
-test( "testValidateSsn", function() {
-    expect(8);
-    equal(true, $.validator.methods['validate-ssn'].call(this, ""));
-    equal(true, $.validator.methods['validate-ssn'].call(this, null));
-    equal(true, $.validator.methods['validate-ssn'].call(this, undefined));
-    equal(false, $.validator.methods['validate-ssn'].call(this, "   "));
-    equal(false, $.validator.methods['validate-ssn'].call(this, "abc"));
-    equal(true, $.validator.methods['validate-ssn'].call(this, "123-13-1234"));
-    equal(true, $.validator.methods['validate-ssn'].call(this, "012-12-1234"));
-    equal(false, $.validator.methods['validate-ssn'].call(this, "23-12-1234"));
-});
-
-test( "testValidateZip", function() {
-    expect(8);
-    equal(true, $.validator.methods['validate-zip-us'].call(this, ""));
-    equal(true, $.validator.methods['validate-zip-us'].call(this, null));
-    equal(true, $.validator.methods['validate-zip-us'].call(this, undefined));
-    equal(false, $.validator.methods['validate-zip-us'].call(this, "   "));
-    equal(true, $.validator.methods['validate-zip-us'].call(this, "12345-1234"));
-    equal(true, $.validator.methods['validate-zip-us'].call(this, "02345"));
-    equal(false, $.validator.methods['validate-zip-us'].call(this, "1234"));
-    equal(false, $.validator.methods['validate-zip-us'].call(this, "1234-1234"));
-});
-
-test( "testValidateDateAu", function() {
-    expect(8);
-    equal(true, $.validator.methods['validate-date-au'].call(this, ""));
-    equal(true, $.validator.methods['validate-date-au'].call(this, null));
-    equal(true, $.validator.methods['validate-date-au'].call(this, undefined));
-    equal(false, $.validator.methods['validate-date-au'].call(this, "   "));
-    equal(true, $.validator.methods['validate-date-au'].call(this, "01/01/2012"));
-    equal(true, $.validator.methods['validate-date-au'].call(this, "30/01/2012"));
-    equal(false, $.validator.methods['validate-date-au'].call(this, "01/30/2012"));
-    equal(false, $.validator.methods['validate-date-au'].call(this, "1/1/2012"));
-});
-
-test( "testValidateCurrencyDollar", function() {
-    expect(8);
-    equal(true, $.validator.methods['validate-currency-dollar'].call(this, ""));
-    equal(true, $.validator.methods['validate-currency-dollar'].call(this, null));
-    equal(true, $.validator.methods['validate-currency-dollar'].call(this, undefined));
-    equal(false, $.validator.methods['validate-currency-dollar'].call(this, "   "));
-    equal(true, $.validator.methods['validate-currency-dollar'].call(this, "$123"));
-    equal(true, $.validator.methods['validate-currency-dollar'].call(this, "$1,123.00"));
-    equal(true, $.validator.methods['validate-currency-dollar'].call(this, "$1234"));
-    equal(false, $.validator.methods['validate-currency-dollar'].call(this, "$1234.1234"));
-});
-
-test( "testValidateNotNegativeNumber", function() {
-    expect(11);
-    equal(true, $.validator.methods['validate-not-negative-number'].call(this, ""));
-    equal(true, $.validator.methods['validate-not-negative-number'].call(this, null));
-    equal(true, $.validator.methods['validate-not-negative-number'].call(this, undefined));
-    equal(false, $.validator.methods['validate-not-negative-number'].call(this, "   "));
-    equal(true, $.validator.methods['validate-not-negative-number'].call(this, "0"));
-    equal(true, $.validator.methods['validate-not-negative-number'].call(this, "1"));
-    equal(true, $.validator.methods['validate-not-negative-number'].call(this, "1234"));
-    equal(true, $.validator.methods['validate-not-negative-number'].call(this, "1,234.1234"));
-    equal(false, $.validator.methods['validate-not-negative-number'].call(this, "-1"));
-    equal(false, $.validator.methods['validate-not-negative-number'].call(this, "-1e"));
-    equal(false, $.validator.methods['validate-not-negative-number'].call(this, "-1,234.1234"));
-});
-
-test( "testValidateGreaterThanZero", function() {
-    expect(11);
-    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, ""));
-    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, null));
-    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, undefined));
-    equal(false, $.validator.methods['validate-greater-than-zero'].call(this, "   "));
-    equal(false, $.validator.methods['validate-greater-than-zero'].call(this, "0"));
-    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, "1"));
-    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, "1234"));
-    equal(true, $.validator.methods['validate-greater-than-zero'].call(this, "1,234.1234"));
-    equal(false, $.validator.methods['validate-greater-than-zero'].call(this, "-1"));
-    equal(false, $.validator.methods['validate-greater-than-zero'].call(this, "-1e"));
-    equal(false, $.validator.methods['validate-greater-than-zero'].call(this, "-1,234.1234"));
-});
-
-test( "testValidateCssLength", function() {
-    expect(11);
-    equal(true, $.validator.methods['validate-css-length'].call(this, ""));
-    equal(true, $.validator.methods['validate-css-length'].call(this, null));
-    equal(true, $.validator.methods['validate-css-length'].call(this, undefined));
-    equal(false, $.validator.methods['validate-css-length'].call(this, "   "));
-    equal(false, $.validator.methods['validate-css-length'].call(this, "0"));
-    equal(true, $.validator.methods['validate-css-length'].call(this, "1"));
-    equal(true, $.validator.methods['validate-css-length'].call(this, "1234"));
-    equal(true, $.validator.methods['validate-css-length'].call(this, "1,234.1234"));
-    equal(false, $.validator.methods['validate-css-length'].call(this, "-1"));
-    equal(false, $.validator.methods['validate-css-length'].call(this, "-1e"));
-    equal(false, $.validator.methods['validate-css-length'].call(this, "-1,234.1234"));
-});
-
-test( "testValidateData", function() {
-    expect(9);
-    equal(true, $.validator.methods['validate-data'].call(this, ""));
-    equal(true, $.validator.methods['validate-data'].call(this, null));
-    equal(true, $.validator.methods['validate-data'].call(this, undefined));
-    equal(false, $.validator.methods['validate-data'].call(this, "   "));
-    equal(false, $.validator.methods['validate-data'].call(this, "123abc"));
-    equal(true, $.validator.methods['validate-data'].call(this, "abc"));
-    equal(false, $.validator.methods['validate-data'].call(this, " abc"));
-    equal(true, $.validator.methods['validate-data'].call(this, "abc123"));
-    equal(false, $.validator.methods['validate-data'].call(this, "abc-123"));
-});
-
-
-test( "testValidateOneRequiredByName", function() {
-    expect(4);
-    var radio = $('<input type="radio" name="radio"/>');
-    radio.appendTo("#qunit-fixture");
-    ok(!$.validator.methods['validate-one-required-by-name'].call(this,
-        null, radio[0]));
-    var radio2 = $('<input type="radio" name="radio" checked/>');
-    radio2.appendTo("#qunit-fixture");
-    ok($.validator.methods['validate-one-required-by-name'].call(this,
-        null, radio2[0]));
-
-    var checkbox = $('<input type="checkbox" name="checkbox"/>');
-    checkbox.appendTo("#qunit-fixture");
-    ok(!$.validator.methods['validate-one-required-by-name'].call(this,
-        null, checkbox[0]));
-    var checkbox2 = $('<input type="checkbox" name="checkbox" checked/>');
-    checkbox2.appendTo("#qunit-fixture");
-    ok($.validator.methods['validate-one-required-by-name'].call(this,
-        null, checkbox2[0]));
-});
-
-test( "testLessThanEqualsTo", function() {
-    expect(5);
-    var elm1 =  $('<input type="text" value=6 id="element1" />');
-    var elm2 =  $('<input type="text" value=5 id="element2" />');
-    ok(!$.validator.methods['less-than-equals-to'].call(this, elm1[0].value,
-        elm1, elm2));
-    elm1[0].value = 4;
-    ok($.validator.methods['less-than-equals-to'].call(this, elm1[0].value,
-        elm1, elm2));
-
-    var elm3 =  $('<input type="text" id="element3" />');
-    var elm4=  $('<input type="text" value=5 id="element4" />');
-    ok($.validator.methods['less-than-equals-to'].call(this, elm3[0].value,
-        elm3, elm4));
-
-    var elm5 =  $('<input type="text" id="element6" />');
-    var elm6=  $('<input type="text" value=6 id="element5" />');
-    ok($.validator.methods['less-than-equals-to'].call(this, elm5[0].value,
-        elm5, elm6));
-
-    var elm7 =  $('<input type="text" value=20 id="element7" />');
-    var elm8=  $('<input type="text" value=100 id="element8" />');
-    ok($.validator.methods['less-than-equals-to'].call(this, elm7[0].value,
-        elm7, elm8));
-});
-
-test( "testGreaterThanEqualsTo", function() {
-    expect(5);
-
-    var elm1 =  $('<input type="text" value=6 id="element1" />');
-    var elm2 =  $('<input type="text" value=7 id="element2" />');
-    ok(!$.validator.methods['greater-than-equals-to'].call(this, elm1[0].value,
-        elm1, elm2));
-    elm1[0].value = 9;
-    ok($.validator.methods['greater-than-equals-to'].call(this, elm1[0].value,
-        elm1, elm2));
-
-    var elm3 =  $('<input type="text" id="element3" />');
-    var elm4=  $('<input type="text" value=5 id="element4" />');
-    ok($.validator.methods['greater-than-equals-to'].call(this, elm3[0].value,
-        elm3, elm4));
-
-    var elm5 =  $('<input type="text" id="element6" />');
-    var elm6=  $('<input type="text" value=6 id="element5" />');
-    ok($.validator.methods['greater-than-equals-to'].call(this, elm5[0].value,
-        elm5, elm6));
-
-    var elm7 =  $('<input type="text" value=100 id="element7" />');
-    var elm8=  $('<input type="text" value=20 id="element8" />');
-    ok($.validator.methods['greater-than-equals-to'].call(this, elm7[0].value,
-        elm7, elm8));
-});
-
-test( "testValidateGroupedQty", function() {
-    expect(5);
-    var div1 = $('<div id="div1"/>');
-    $('<input type="text"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
-                             .appendTo(div1);
-    $('<input type="text"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
-                             .appendTo(div1);
-    $('<input type="text"/>').appendTo(div1);
-
-    ok(!$.validator.methods['validate-grouped-qty'].call(this, null, null, div1[0]));
-
-    var div2 = $('<div id="div2"/>');
-    $('<input type="text"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
-        .appendTo(div2);
-    $('<input type="text" value="a"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
-        .appendTo(div2);
-    $('<input type="text"/>').appendTo(div2);
-    ok(!$.validator.methods['validate-grouped-qty'].call(this, null, null, div2[0]));
-
-    var div3 = $('<div id="div3"/>');
-    $('<input type="text"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
-        .appendTo(div3);
-    $('<input type="text" value="-6"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
-        .appendTo(div3);
-    $('<input type="text"/>').appendTo(div3);
-    ok(!$.validator.methods['validate-grouped-qty'].call(this, null, null, div3[0]));
-
-    var div4 = $('<div id="div4"/>');
-    $('<input type="text"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
-        .appendTo(div4);
-    $('<input type="text" value="6"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
-        .appendTo(div4);
-    $('<input type="text"/>').appendTo(div4);
-    ok($.validator.methods['validate-grouped-qty'].call(this, null, null, div4[0]));
-
-    var div5 = $('<div id="div5"/>');
-    $('<input type="text" value=""/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
-        .appendTo(div5);
-    $('<input type="text" value="6"/>').attr("data-validate","{'validate-grouped-qty':'#super-product-table'}")
-        .appendTo(div5);
-    $('<input type="text"/>').appendTo(div5);
-    ok($.validator.methods['validate-grouped-qty'].call(this, null, null, div5[0]));
-
-});
-
-test( "testValidateCCTypeSelect", function() {
-    expect(14);
-     var visaValid = $('<input id="visa-valid" type="text" value="4916808263499650"/>');
-     var visaInvalid = $('<input id="visa-invalid" type="text" value="1234567890123456"/>');
-     var mcValid = $('<input id="mc-valid" type="text" value="5203731841177490"/>');
-     var mcInvalid = $('<input id="mc-invalid" type="text" value="1111222233334444"/>');
-     var aeValid = $('<input id="ae-valid" type="text" value="376244899619217"/>');
-     var aeInvalid = $('<input id="ae-invalid" type="text" value="123451234512345"/>');
-
-    var diValid = $('<input id="di-valid" type="text" value="6011050000000009"/>');
-    var diInvalid = $('<input id="di-invalid" type="text" value="6011199900000005"/>');
-    var dnValid = $('<input id="dn-valid" type="text" value="3095434000000001"/>');
-    var dnInvalid = $('<input id="dn-invalid" type="text" value="3799999900000003"/>');
-    var jcbValid = $('<input id="jcb-valid" type="text" value="3528000000000007"/>');
-    var jcbInvalid = $('<input id="jcb-invalid" type="text" value="359000001111118"/>');
-    var upValid = $('<input id="up-valid" type="text" value="6221260000000000"/>');
-    var upInvalid = $('<input id="up-invalid" type="text" value="6229260000000002"/>');
-
-    ok($.validator.methods['validate-cc-type-select'].call(this, 'VI', null, visaValid));
-    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'VI', null, visaInvalid));
-    ok($.validator.methods['validate-cc-type-select'].call(this, 'MC', null, mcValid));
-    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'MC', null, mcInvalid));
-    ok($.validator.methods['validate-cc-type-select'].call(this, 'AE', null, aeValid));
-    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'AE', null, aeInvalid));
-    ok($.validator.methods['validate-cc-type-select'].call(this, 'DI', null, diValid));
-    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'DI', null, diInvalid));
-    ok($.validator.methods['validate-cc-type-select'].call(this, 'DN', null, dnValid));
-    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'DN', null, dnInvalid));
-    ok($.validator.methods['validate-cc-type-select'].call(this, 'JCB', null, jcbValid));
-    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'JCB', null, jcbInvalid));
-    ok($.validator.methods['validate-cc-type-select'].call(this, 'UP', null, upValid));
-    ok(!$.validator.methods['validate-cc-type-select'].call(this, 'UP', null, upInvalid));
-});
-
-test( "testValidateCCNumber", function() {
-    expect(37);
-    ok($.validator.methods['validate-cc-number'].call(this, '4916835098995909', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '5265071363284878', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '6011120623356953', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '371293266574617', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '4916835098995901', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '5265071363284870', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '6011120623356951', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '371293266574619', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '2221220000000003', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '2721220000000008', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '601109020000000003', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '6011111144444444', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '6011222233334444', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '6011522233334447', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '601174455555553', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '6011745555555550', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '601177455555556', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '601182455555556', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '601187999555558', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '601287999555556', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '6444444444444443', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '6644444444444441', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '3044444444444444', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '3064444444444449', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '3095444444444442', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '3096444444444441', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '3696444444444445', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '3796444444444444', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '3896444444444443', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '3528444444444449', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '3529444444444448', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '6221262244444440', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '6229981111111111', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '6249981111111117', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '6279981111111110', null, null));
-    ok($.validator.methods['validate-cc-number'].call(this, '6282981111111115', null, null));
-    ok(!$.validator.methods['validate-cc-number'].call(this, '6289981111111118', null, null));
-});
-
-test( "testValidateCCType", function() {
-    expect(14);
-    var select = $('<select id="cc-type">' +
-        '<option value="">' +
-        '</option><option value="VI">' +
-        '</option><option value="MC">' +
-        '</option><option value="AE">' +
-        '</option><option value="DI">' +
-        '</option><option value="DN">' +
-        '</option><option value="JCB">' +
-        '</option><option value="UP">' +
-        '</option>' +
-        '</select>');
-
-    select.val('VI');
-    ok($.validator.methods['validate-cc-type'].call(this, '4916835098995909', null, select));
-    ok(!$.validator.methods['validate-cc-type'].call(this, '5265071363284878', null, select));
-    select.val('MC');
-    ok($.validator.methods['validate-cc-type'].call(this, '5265071363284878', null, select));
-    ok(!$.validator.methods['validate-cc-type'].call(this, '4916835098995909', null, select));
-    select.val('AE');
-    ok($.validator.methods['validate-cc-type'].call(this, '371293266574617', null, select));
-    ok(!$.validator.methods['validate-cc-type'].call(this, '5265071363284878', null, select));
-    select.val('DI');
-    ok($.validator.methods['validate-cc-type'].call(this, '6011050000000009', null, select));
-    ok(!$.validator.methods['validate-cc-type'].call(this, '371293266574617', null, select));
-    select.val('DN');
-    ok($.validator.methods['validate-cc-type'].call(this, '3095434000000001', null, select));
-    ok(!$.validator.methods['validate-cc-type'].call(this, '6011050000000009', null, select));
-    select.val('JCB');
-    ok($.validator.methods['validate-cc-type'].call(this, '3528000000000007', null, select));
-    ok(!$.validator.methods['validate-cc-type'].call(this, '3095434000000001', null, select));
-    select.val('UP');
-    ok($.validator.methods['validate-cc-type'].call(this, '6221260000000000', null, select));
-    ok(!$.validator.methods['validate-cc-type'].call(this, '3528000000000007', null, select));
-});
-
-test( "testValidateCCExp", function() {
-    expect(3);
-    var year = $('<input id="year" type="text" value="4916808263499650"/>'),
-        currentTime  = new Date(),
-        currentMonth = currentTime.getMonth() + 1,
-        currentYear  = currentTime.getFullYear();
-    year.val(currentYear);
-    if (currentMonth > 1) {
-        ok(!$.validator.methods['validate-cc-exp'].call(this, currentMonth - 1, null, year));
-    }
-    ok($.validator.methods['validate-cc-exp'].call(this, currentMonth, null, year));
-    year.val(currentYear + 1);
-    ok($.validator.methods['validate-cc-exp'].call(this, currentMonth, null, year));
-
-});
-
-test( "testValidateCCCvn", function() {
-    expect(8);
-     var ccType = $('<select id="cc-type">'+
-     '<option value=""></option>'+
-     '<option value="VI"></option>'+
-     '<option value="MC"></option>'+
-     '<option value="AE"></option>'+
-     '<option value="DI"></option>'+
-     '</select>');
-
-    ccType.val('VI');
-    ok($.validator.methods['validate-cc-cvn'].call(this, '123', null, ccType));
-    ok(!$.validator.methods['validate-cc-cvn'].call(this, '1234', null, ccType));
-    ccType.val('MC');
-    ok($.validator.methods['validate-cc-cvn'].call(this, '123', null, ccType));
-    ok(!$.validator.methods['validate-cc-cvn'].call(this, '1234', null, ccType));
-    ccType.val('AE');
-    ok($.validator.methods['validate-cc-cvn'].call(this, '1234', null, ccType));
-    ok(!$.validator.methods['validate-cc-cvn'].call(this, '123', null, ccType));
-    ccType.val('DI');
-    ok($.validator.methods['validate-cc-cvn'].call(this, '123', null, ccType));
-    ok(!$.validator.methods['validate-cc-cvn'].call(this, '1234', null, ccType));
-});
-
-test( "testValidateNumberRange", function() {
-    expect(14);
-    ok($.validator.methods['validate-number-range'].call(this, '-1', null, null));
-    ok($.validator.methods['validate-number-range'].call(this, '1', null, null));
-    ok($.validator.methods['validate-number-range'].call(this, '', null, null));
-    ok($.validator.methods['validate-number-range'].call(this, null, null, null));
-    ok($.validator.methods['validate-number-range'].call(this, '0', null, null));
-    ok(!$.validator.methods['validate-number-range'].call(this, 'asds', null, null));
-
-    ok($.validator.methods['validate-number-range'].call(this, '10', null, '10-20.06'));
-    ok($.validator.methods['validate-number-range'].call(this, '15', null, '10-20.06'));
-    ok(!$.validator.methods['validate-number-range'].call(this, '1', null, '10-20.06'));
-    ok(!$.validator.methods['validate-number-range'].call(this, '30', null, '10-20.06'));
-
-    var el1 = $('<input type="text" value="" class="validate-number-range number-range-10-20 number-range-10-100.20">').get(0);
-    ok($.validator.methods['validate-number-range'].call(this, '10', el1, null));
-    ok($.validator.methods['validate-number-range'].call(this, '15', el1, null));
-    ok(!$.validator.methods['validate-number-range'].call(this, '1', el1, null));
-    ok($.validator.methods['validate-number-range'].call(this, '30', el1, null));
-});
-
-
-
-test( "testValidateDigitsRange", function() {
-    expect(15);
-    ok($.validator.methods['validate-digits-range'].call(this, '-1', null, null));
-    ok($.validator.methods['validate-digits-range'].call(this, '1', null, null));
-    ok($.validator.methods['validate-digits-range'].call(this, '', null, null));
-    ok($.validator.methods['validate-digits-range'].call(this, null, null, null));
-    ok($.validator.methods['validate-digits-range'].call(this, '0', null, null));
-    ok(!$.validator.methods['validate-digits-range'].call(this, 'asds', null, null));
-
-    ok($.validator.methods['validate-digits-range'].call(this, '10', null, '10-20'));
-    ok($.validator.methods['validate-digits-range'].call(this, '15', null, '10-20'));
-    ok(!$.validator.methods['validate-digits-range'].call(this, '1', null, '10-20'));
-    ok(!$.validator.methods['validate-digits-range'].call(this, '30', null, '10-20'));
-    ok($.validator.methods['validate-digits-range'].call(this, '30', null, '10-20.06'));
-
-    var el1 = $('<input type="text" value="" class="validate-digits-range digits-range-10-20 digits-range-10-100.20">').get(0);
-    ok($.validator.methods['validate-digits-range'].call(this, '10', el1, null));
-    ok($.validator.methods['validate-digits-range'].call(this, '15', el1, null));
-    ok(!$.validator.methods['validate-digits-range'].call(this, '1', el1, null));
-    ok(!$.validator.methods['validate-digits-range'].call(this, '30', el1, null));
-});
diff --git a/dev/tests/js/JsTestDriver/testsuite/mage/menu/index.html b/dev/tests/js/jasmine/assets/lib/web/mage/menu.html
similarity index 50%
rename from dev/tests/js/JsTestDriver/testsuite/mage/menu/index.html
rename to dev/tests/js/jasmine/assets/lib/web/mage/menu.html
index d0a3b9b873801e700378bfc6b3588c2ac4b8e794..03c673a7dac5fbc69fee9d2e38edf78bdc66d9ab 100644
--- a/dev/tests/js/JsTestDriver/testsuite/mage/menu/index.html
+++ b/dev/tests/js/jasmine/assets/lib/web/mage/menu.html
@@ -1,36 +1,10 @@
-<!--
-/**
- * @category    mage.menu
- * @package     test
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
--->
-
-<!DOCTYPE html>
-<html>
-<head>
-    <title>Unit test</title>
-    <base href="../../../"/>
-    <link type="text/css" rel="stylesheet" href="framework/qunit/qunit-1.14.0.css"/>
-    <script type="text/javascript" src="framework/qunit/qunit-1.14.0.js"></script>
-    <script src="../../../pub/lib/jquery.js"></script>
-    <script src="../../../pub/lib/jquery/jquery-ui.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/mage.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/menu.js"></script>
-    <script type="text/javascript" src="../../../pub/lib/mage/bootstrap.js"></script>
-    <script type="text/javascript" src="testsuite/mage/menu/test-menu.js"></script>
-
-</head>
-<body>
-<div id="qunit"></div>
-<div id="qunit-fixture">
 <ul id="menu">
     <li class="foo">Aberdeen</li>
     <li class="foo">Ada</li>
     <li class="foo">Adamsville</li>
     <li class="foo"><span class="ui-icon ui-icon-print"></span>Addyston</li>
-    <li>Delphi
+    <li class="test-menu-item">
+        <a>Delphi</a>
         <ul>
             <li class="foo">Ada</li>
             <li class="foo">Saarland</li>
@@ -38,7 +12,8 @@
         </ul>
     </li>
     <li class="foo">Saarland</li>
-    <li>Salzburg
+    <li>
+        <a>Salzburg</a>
         <ul>
             <li>Delphi
                 <ul>
@@ -60,7 +35,4 @@
             <li class="foo">Perch</li>
         </ul>
     </li>
-</ul>
-</div>
-</body>
-</html>
+</ul>
\ No newline at end of file
diff --git a/dev/tests/js/jasmine/assets/lib/web/mage/tabs.html b/dev/tests/js/jasmine/assets/lib/web/mage/tabs.html
new file mode 100644
index 0000000000000000000000000000000000000000..dd4d665ca188e671b2e2382e986461db50474601
--- /dev/null
+++ b/dev/tests/js/jasmine/assets/lib/web/mage/tabs.html
@@ -0,0 +1,8 @@
+<div id="tabs">
+    <div id="title1" data-role="collapsible">
+    </div>
+    <div id="content1" data-role="content"></div>
+    <div id="title2" data-role="collapsible">
+    </div>
+    <div id="content2" data-role="content"></div>
+</div>
\ No newline at end of file
diff --git a/dev/tests/js/jasmine/assets/lib/web/mage/translate-inline.html b/dev/tests/js/jasmine/assets/lib/web/mage/translate-inline.html
new file mode 100644
index 0000000000000000000000000000000000000000..5e48598a081a24d176de38fff5f14ab106bb7e00
--- /dev/null
+++ b/dev/tests/js/jasmine/assets/lib/web/mage/translate-inline.html
@@ -0,0 +1,4 @@
+<script id="translate-form-template" type="text/x-magento-template">
+    <form id="<%= data.id %>"><%= data.newTemplateVariable %></form>
+</script>
+<div data-role="translate-dialog"></div>
\ No newline at end of file
diff --git a/dev/tests/js/jasmine/tests/lib/mage/accordion.test.js b/dev/tests/js/jasmine/tests/lib/mage/accordion.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..19a54d95cf704236cbacc75fa9e64ae260dc1105
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/accordion.test.js
@@ -0,0 +1,80 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+define([
+    'jquery',
+    'mage/accordion'
+], function ($) {
+    'use strict';
+
+    describe('Test for mage/accordion jQuery plugin', function () {
+        it('check if accordion can be initialized', function () {
+            var accordion = $('<div/>');
+
+            accordion.accordion();
+            expect(accordion.is(':mage-accordion')).toBeTruthy();
+
+            accordion.accordion('destroy');
+            expect(accordion.is(':mage-accordion')).toBeFalsy();
+        });
+        it('check one-collapsible element accordion', function () {
+            var accordion = $('<div/>'),
+                title1 = $('<div data-role="collapsible"></div>').appendTo(accordion),
+                content1 = $('<div data-role="content"></div>').appendTo(accordion),
+                title2 = $('<div data-role="collapsible"></div>').appendTo(accordion),
+                content2 = $('<div data-role="content"></div>').appendTo(accordion);
+
+            accordion.appendTo('body');
+
+            accordion.accordion();
+
+            expect(accordion.is(':mage-accordion')).toBeTruthy();
+
+            expect(content1.is(':visible')).toBeTruthy();
+            expect(content2.is(':hidden')).toBeTruthy();
+
+            title2.trigger('click');
+
+            expect(content1.is(':hidden')).toBeTruthy();
+            expect(content2.is(':visible')).toBeTruthy();
+
+            title1.trigger('click');
+
+            expect(content1.is(':visible')).toBeTruthy();
+            expect(content2.is(':hidden')).toBeTruthy();
+
+            accordion.accordion('destroy');
+
+            expect(accordion.is(':mage-accordion')).toBeFalsy();
+        });
+        it('check multi-collapsible element accordion', function () {
+            var accordion = $('<div/>'),
+                title1 = $('<div data-role="collapsible"></div>').appendTo(accordion),
+                content1 = $('<div data-role="content"></div>').appendTo(accordion),
+                title2 = $('<div data-role="collapsible"></div>').appendTo(accordion),
+                content2 = $('<div data-role="content"></div>').appendTo(accordion);
+
+            accordion.appendTo('body');
+
+            accordion.accordion({
+                multipleCollapsible: true
+            });
+
+            expect(accordion.is(':mage-accordion')).toBeTruthy();
+            expect(content1.is(':visible')).toBeTruthy();
+            expect(content2.is(':hidden')).toBeTruthy();
+
+            $(title1).trigger('click');
+            expect(content1.is(':visible')).toBeTruthy();
+            expect(content2.is(':hidden')).toBeTruthy();
+
+            $(title2).trigger('click');
+            expect(content1.is(':visible')).toBeTruthy();
+            expect(content2.is(':visible')).toBeTruthy();
+
+            accordion.accordion('destroy');
+            expect(accordion.is(':mage-accordion')).toBeFalsy();
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/backend/suggest.test.js b/dev/tests/js/jasmine/tests/lib/mage/backend/suggest.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..84880e6af72c5d362464b88b12b8b7a36b4f7675
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/backend/suggest.test.js
@@ -0,0 +1,524 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/* eslint-disable max-nested-callbacks */
+define([
+    'jquery',
+    'mage/backend/suggest'
+], function ($) {
+    'use strict';
+
+    describe('mage/backend/suggest', function () {
+        var suggestSelector = '#suggest';
+
+        beforeEach(function () {
+            var $suggest = $('<input name="test-suggest" id="suggest" />');
+
+            $('body').append($suggest);
+            $('body').append('<script type="text/template" id="test-template">' +
+                '<div><%= data.test %></div>' +
+                '</script>');
+        });
+
+        afterEach(function () {
+            $(suggestSelector).remove();
+            $('#test-template').remove();
+            $(suggestSelector).suggest('destroy');
+        });
+
+        it('Check that suggest inited', function () {
+            var $suggest = $(suggestSelector).suggest({
+                template: '#test-template',
+                choiceTemplate: '<li/>'
+            });
+
+            expect($suggest.is(':mage-suggest')).toBe(true);
+        });
+
+        it('Check suggest create', function () {
+            var options = {
+                    template: '#test-template',
+                    choiceTemplate: '<li/>',
+                    controls: {
+                        selector: '.test',
+                        eventsMap: {
+                            focus: ['testfocus'],
+                            blur: ['testblur'],
+                            select: ['testselect']
+                        }
+                    },
+                    showRecent: true,
+                    storageKey: 'test-suggest-recent',
+                    multiselect: true
+                },
+                recentItems = [{
+                        id: '1',
+                        label: 'TestLabel1'
+                    },
+                    {
+                        id: '2',
+                        label: 'TestLabel2'
+                    }
+                ],
+                nonSelectedItem = {
+                    id: '',
+                    label: ''
+                },
+                suggestInstance;
+
+            if (window.localStorage) {
+                localStorage.setItem(options.storageKey, JSON.stringify(recentItems));
+            }
+
+            suggestInstance = $(suggestSelector).suggest(options).data('mage-suggest');
+
+            expect(suggestInstance._term).toBe(null);
+            expect(suggestInstance._nonSelectedItem).toEqual(nonSelectedItem);
+            expect(suggestInstance._renderedContext).toBe(null);
+            expect(suggestInstance._selectedItem).toEqual(nonSelectedItem);
+            expect(suggestInstance._control).toEqual(suggestInstance.options.controls);
+            expect(suggestInstance._recentItems).toEqual(window.localStorage ? recentItems : []);
+            expect(suggestInstance.valueField.is(':hidden')).toBe(true);
+
+            if (window.localStorage) {
+                localStorage.removeItem(options.storageKey);
+            }
+        });
+
+        it('Check suggest render', function () {
+            var options = {
+                    template: '#test-template',
+                    choiceTemplate: '<li/>',
+                    dropdownWrapper: '<div class="wrapper-test"></div>',
+                    className: 'test-suggest',
+                    inputWrapper: '<div class="test-input-wrapper"></div>'
+                },
+                suggestInstance = $(suggestSelector).suggest(options).data('mage-suggest');
+
+            suggestInstance._render();
+
+            expect(suggestInstance.dropdown.hasClass('wrapper-test')).toBe(true);
+            expect(suggestInstance.dropdown.is(':hidden')).toBe(true);
+            expect(suggestInstance.element.closest('.test-input-wrapper').size()).toBeGreaterThan(0);
+            expect(suggestInstance.element.closest('.' + options.className).size()).toBeGreaterThan(0);
+            expect(suggestInstance.element.attr('autocomplete')).toBe('off');
+
+            options.appendMethod = 'before';
+            $(suggestSelector).suggest('destroy');
+            suggestInstance = $(suggestSelector).suggest(options).data('mage-suggest');
+            suggestInstance._render();
+            expect(suggestInstance.element.prev().is(suggestInstance.dropdown)).toBe(true);
+
+            options.appendMethod = 'after';
+            $(suggestSelector).suggest('destroy');
+            suggestInstance = $(suggestSelector).suggest(options).data('mage-suggest');
+            suggestInstance._render();
+            expect(suggestInstance.element.next().is(suggestInstance.dropdown)).toBe(true);
+        });
+
+        it('Check suggest createValueField', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>'
+                }).data('mage-suggest'),
+                valueField = suggestInstance._createValueField();
+
+            expect(valueField.is('input')).toBe(true);
+            expect(valueField.is(':hidden')).toBe(true);
+
+            $(suggestSelector).suggest('destroy');
+            suggestInstance = $(suggestSelector).suggest({
+                multiselect: true,
+                template: '#test-template',
+                choiceTemplate: '<li/>'
+            }).data('mage-suggest');
+            valueField = suggestInstance._createValueField();
+
+            expect(valueField.is('select')).toBe(true);
+            expect(valueField.is(':hidden')).toBe(true);
+            expect(valueField.attr('multiple')).toBe('multiple');
+        });
+
+        it('Check suggest prepareValueField', function () {
+            var $suggest = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>'
+                }),
+                suggestInstance = $suggest.data('mage-suggest'),
+                suggestName = $suggest.attr('name');
+
+            suggestInstance._prepareValueField();
+
+            expect(suggestInstance.valueField).not.toBe(true);
+            expect(suggestInstance.element.prev().is(suggestInstance.valueField)).toBe(true);
+            expect(suggestInstance.element.attr('name')).toBe(undefined);
+            expect(suggestInstance.valueField.attr('name')).toBe(suggestName);
+        });
+
+        it('Check suggest destroy', function () {
+            var options = {
+                    template: '#test-template',
+                    choiceTemplate: '<li/>',
+                    inputWrapper: '<div class="test-input-wrapper"></div>',
+                    valueField: null
+                },
+                $suggest = $(suggestSelector).suggest(options),
+                suggestInstance = $suggest.data('mage-suggest'),
+                suggestName = $suggest.attr('name');
+
+            expect(suggestInstance.dropdown).not.toBe(undefined);
+            expect(suggestInstance.valueField).not.toBe(undefined);
+            expect(suggestName).toBe(undefined);
+
+            $suggest.suggest('destroy');
+
+            expect($suggest.closest('.test-input-wrapper').length).toBe(0);
+            expect($suggest.attr('autocomplete')).toBe(undefined);
+            expect($suggest.attr('name')).toBe(suggestInstance.valueField.attr('name'));
+            expect(suggestInstance.valueField.parents('html').length).not.toBeGreaterThan(0);
+            expect(suggestInstance.dropdown.parents('html').length).not.toBeGreaterThan(0);
+        });
+
+        it('Check suggest value', function () {
+            var value = 'test-value',
+                suggestInstance, suggestDivInstance;
+
+            $(suggestSelector).val(value);
+            $('body').append('<div id="suggest-div">' + value + '</div>');
+
+            suggestInstance = $(suggestSelector).suggest({
+                template: '#test-template',
+                choiceTemplate: '<li/>'
+            }).data('mage-suggest');
+            suggestDivInstance = $('#suggest-div').suggest({
+                template: '#test-template',
+                choiceTemplate: '<li/>'
+            }).data('mage-suggest');
+
+            expect(suggestInstance._value()).toBe(value);
+            expect(suggestDivInstance._value()).toBe(value);
+            $('#suggest-div').remove();
+        });
+
+        it('Check suggest bind', function () {
+            var eventIsBinded = false,
+                options = {
+                    template: '#test-template',
+                    choiceTemplate: '<li/>',
+                    events: {
+                        /** Stub function */
+                        click: function () {
+                            eventIsBinded = true;
+                        }
+                    }
+                },
+                $suggest = $(suggestSelector).suggest(options);
+
+            $suggest.trigger('click');
+            expect(eventIsBinded).toBe(true);
+        });
+
+        it('Check suggest focus/blur', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>'
+                }).data('mage-suggest'),
+                uiHash = {
+                    item: {
+                        id: 1,
+                        label: 'Test Label'
+                    }
+                };
+
+            expect(suggestInstance._focused).toBe(undefined);
+            expect(suggestInstance.element.val()).toBe('');
+
+            suggestInstance._focusItem($.Event('focus'), uiHash);
+
+            expect(suggestInstance._focused).toEqual(uiHash.item);
+            expect(suggestInstance.element.val()).toBe(uiHash.item.label);
+
+            suggestInstance._blurItem();
+
+            expect(suggestInstance._focused).toBe(null);
+            expect(suggestInstance.element.val()).toBe('');
+        });
+
+        it('Check suggest select', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>'
+                }).data('mage-suggest'),
+                uiHash = {
+                    item: {
+                        id: 1,
+                        label: 'Test Label'
+                    }
+                };
+
+            suggestInstance._focused = suggestInstance._term = suggestInstance._selectedItem = null;
+            suggestInstance.valueField.val('');
+            suggestInstance._selectItem($.Event('select'));
+
+            expect(suggestInstance._selectedItem).toBe(null);
+            expect(suggestInstance._term).toBe(null);
+            expect(suggestInstance.valueField.val()).toBe('');
+            expect(suggestInstance.dropdown.is(':hidden')).toBe(true);
+
+            suggestInstance._focused = uiHash.item;
+            suggestInstance._selectItem($.Event('select'));
+
+            expect(suggestInstance._selectedItem).toEqual(suggestInstance._focused);
+            expect(suggestInstance._term).toBe(suggestInstance._focused.label);
+            expect(suggestInstance.valueField.val()).toBe(suggestInstance._focused.id.toString());
+            expect(suggestInstance.dropdown.is(':hidden')).toBe(true);
+        });
+
+        it('Check suggest multiselect', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>',
+                    multiselect: true
+                }).data('mage-suggest'),
+                uiHash = {
+                    item: {
+                        id: 1,
+                        label: 'Test Label'
+                    }
+                },
+                event = $.Event('select'),
+                selectedElement = $('<div/>');
+
+            event.target = selectedElement[0];
+            suggestInstance._focused = suggestInstance._term = suggestInstance._selectedItem = null;
+            suggestInstance.valueField.val('');
+            suggestInstance._selectItem(event);
+
+            expect(suggestInstance._selectedItem).toBe(null);
+            expect(suggestInstance._term).toBe(null);
+            expect(suggestInstance.valueField.find('option').length).not.toBeGreaterThan(0);
+            expect(suggestInstance.dropdown.is(':hidden')).toBe(true);
+
+            suggestInstance._focused = uiHash.item;
+            suggestInstance._selectItem(event);
+
+            expect(suggestInstance._selectedItem).toEqual(suggestInstance._focused);
+            expect(suggestInstance._term).toBe('');
+            expect(suggestInstance._getOption(suggestInstance._focused).length).toBeGreaterThan(0);
+            expect(selectedElement.hasClass(suggestInstance.options.selectedClass)).toBe(true);
+            expect(suggestInstance.dropdown.is(':hidden')).toBe(true);
+
+            suggestInstance._selectItem(event);
+            expect(suggestInstance._selectedItem).toEqual(suggestInstance._nonSelectedItem);
+            expect(suggestInstance._term).toBe('');
+            expect(suggestInstance._getOption(suggestInstance._focused).length).not.toBeGreaterThan(0);
+            expect(selectedElement.hasClass(suggestInstance.options.selectedClass)).toBe(false);
+            expect(suggestInstance.dropdown.is(':hidden')).toBe(true);
+        });
+
+        it('Check suggest reset value', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                template: '#test-template',
+                choiceTemplate: '<li/>'
+            }).data('mage-suggest');
+
+            suggestInstance.valueField.val('test');
+            expect(suggestInstance.valueField.val()).toBe('test');
+            suggestInstance._resetSuggestValue();
+            expect(suggestInstance.valueField.val()).toBe(suggestInstance._nonSelectedItem.id);
+        });
+
+        it('Check suggest reset multiselect value', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>',
+                    multiselect: true
+                }).data('mage-suggest'),
+                uiHash = {
+                    item: {
+                        id: 1,
+                        label: 'Test Label'
+                    }
+                },
+                event = $.Event('select');
+
+            event.target = $('<div/>')[0];
+            suggestInstance._focused = uiHash.item;
+
+            suggestInstance._selectItem(event);
+            suggestInstance._resetSuggestValue();
+
+            expect(suggestInstance.valueField.val() instanceof Array).toBe(true);
+            expect(suggestInstance.valueField.val()[0]).not.toBe(undefined);
+            expect(suggestInstance.valueField.val()[0]).toBe(uiHash.item.id.toString());
+        });
+
+        it('Check suggest read item data', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>'
+                }).data('mage-suggest'),
+                testElement = $('<div/>');
+
+            expect(suggestInstance._readItemData(testElement)).toEqual(suggestInstance._nonSelectedItem);
+            testElement.data('suggestOption', 'test');
+            expect(suggestInstance._readItemData(testElement)).toEqual('test');
+        });
+
+        it('Check suggest template', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '<div><%= data.test %></div>',
+                    choiceTemplate: '<li/>'
+                }).data('mage-suggest'),
+                tmpl = suggestInstance.templates[suggestInstance.templateName],
+                html = $('<div/>').append(tmpl({
+                    data: {
+                        test: 'test'
+                    }
+                })).html();
+
+            expect(html).toEqual('<div>test</div>');
+            suggestInstance.destroy();
+            $('body').append('<script type="text/template" id="test-template">' +
+                '<div><%= data.test %></div>' +
+                '</script>');
+
+            suggestInstance = $(suggestSelector).suggest({
+                template: '#test-template',
+                choiceTemplate: '<li/>'
+            }).data('mage-suggest');
+            tmpl = suggestInstance.templates[suggestInstance.templateName];
+            html = $('<div />').append(tmpl({
+                data: {
+                    test: 'test'
+                }
+            })).html();
+
+            expect(html).toEqual('<div>test</div>');
+            $('#test-template').remove();
+        });
+
+        it('Check suggest dropdown visibility', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                template: '#test-template',
+                choiceTemplate: '<li/>'
+            }).data('mage-suggest');
+
+            suggestInstance.dropdown.hide();
+            expect(suggestInstance.isDropdownShown()).toBe(false);
+            expect(suggestInstance.dropdown.is(':hidden')).toBe(true);
+
+            suggestInstance.dropdown.show();
+            expect(suggestInstance.isDropdownShown()).toBe(true);
+            expect(suggestInstance.dropdown.is(':visible')).toBe(true);
+        });
+
+        it('Check suggest create option', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>'
+                }).data('mage-suggest'),
+                uiHash = {
+                    item: {
+                        id: 1,
+                        label: 'Test Label'
+                    }
+                },
+                option = suggestInstance._createOption(uiHash.item);
+
+            expect(option.val()).toBe('1');
+            expect(option.prop('selected')).toBe(true);
+            expect(option.text()).toBe('Test Label');
+            expect(option.data('renderedOption')).not.toBe(undefined);
+        });
+
+        it('Check suggest add option', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>'
+                }).data('mage-suggest'),
+                uiHash = {
+                    item: {
+                        id: 1,
+                        label: 'Test Label'
+                    }
+                },
+                selectTarget = $('<div/>'),
+                event = $.Event('add'),
+                option;
+
+            event.target = selectTarget[0];
+            suggestInstance._addOption(event, uiHash.item);
+            option = suggestInstance.valueField.find('option[value=' + uiHash.item.id + ']');
+
+            expect(option.length).toBeGreaterThan(0);
+            expect(option.data('selectTarget').is(selectTarget)).toBe(true);
+        });
+
+        it('Check suggest get option', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>'
+                }).data('mage-suggest'),
+                uiHash = {
+                    item: {
+                        id: 1,
+                        label: 'Test Label'
+                    }
+                },
+                option = $('<option value="1">Test Label</option>');
+
+            expect(suggestInstance._getOption(uiHash.item).length).not.toBeGreaterThan(0);
+
+            suggestInstance.valueField.append(option);
+            expect(suggestInstance._getOption(uiHash.item).length).toBeGreaterThan(0);
+            expect(suggestInstance._getOption(option).length).toBeGreaterThan(0);
+        });
+
+        it('Check suggest last added', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>',
+                    multiselect: true
+                }).data('mage-suggest'),
+                uiHash = {
+                    item: {
+                        id: 1,
+                        label: 'Test Label'
+                    }
+                };
+
+            suggestInstance._addOption({}, uiHash.item);
+            expect(suggestInstance.valueField.find('option').length).toBeGreaterThan(0);
+            suggestInstance._removeLastAdded();
+            expect(suggestInstance.valueField.find('option').length).not.toBeGreaterThan(0);
+        });
+
+        it('Check suggest remove option', function () {
+            var suggestInstance = $(suggestSelector).suggest({
+                    template: '#test-template',
+                    choiceTemplate: '<li/>',
+                    multiselect: true
+                }).data('mage-suggest'),
+                uiHash = {
+                    item: {
+                        id: 1,
+                        label: 'Test Label'
+                    }
+                },
+                selectTarget = $('<div/>'),
+                event = $.Event('select');
+
+            selectTarget.addClass(suggestInstance.options.selectedClass);
+            event.target = selectTarget[0];
+
+            suggestInstance._addOption(event, uiHash.item);
+            expect(suggestInstance.valueField.find('option').length).toBeGreaterThan(0);
+            suggestInstance.removeOption(event, uiHash.item);
+            expect(suggestInstance.valueField.find('option').length).not.toBeGreaterThan(0);
+            expect(selectTarget.hasClass(suggestInstance.options.selectedClass)).toBe(false);
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/backend/tree-suggest.test.js b/dev/tests/js/jasmine/tests/lib/mage/backend/tree-suggest.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..b116fc70588088d88b3ddd9cebbd6719531762a8
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/backend/tree-suggest.test.js
@@ -0,0 +1,52 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/* eslint-disable max-nested-callbacks */
+define([
+    'jquery',
+    'mage/backend/tree-suggest'
+], function ($) {
+    'use strict';
+
+    describe('mage/backend/tree-suggest', function () {
+        var treeSuggestSelector = '#tree-suggest';
+
+        beforeEach(function () {
+            var $treeSuggest = $('<input name="test-tree-suggest" id="tree-suggest" />');
+
+            $('body').append($treeSuggest);
+        });
+
+        afterEach(function () {
+            $(treeSuggestSelector).remove();
+            $(treeSuggestSelector).treeSuggest('destroy');
+        });
+
+        it('Check that treeSuggest inited', function () {
+            var $treeSuggest = $(treeSuggestSelector).treeSuggest(),
+                treeSuggestInstance = $treeSuggest.data('mage-treeSuggest');
+
+            expect($treeSuggest.is(':mage-treeSuggest')).toBe(true);
+            expect(treeSuggestInstance.widgetEventPrefix).toBe('suggest');
+        });
+
+        it('Check treeSuggest filter', function () {
+            var treeSuggestInstance = $(treeSuggestSelector).treeSuggest().data('mage-treeSuggest'),
+                uiHash = {
+                    item: {
+                        id: 1,
+                        label: 'Test Label'
+                    }
+                };
+
+            expect(treeSuggestInstance._filterSelected(
+                [uiHash.item],
+                {
+                    _allShown: true
+                }
+            )).toEqual([uiHash.item]);
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/calendar.test.js b/dev/tests/js/jasmine/tests/lib/mage/calendar.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..b2c6aed2c9fbad3a5a9e35e9b1cbbd6e547c1700
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/calendar.test.js
@@ -0,0 +1,173 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/* eslint-disable max-nested-callbacks */
+define([
+    'jquery',
+    'jquery/ui',
+    'mage/calendar'
+], function ($) {
+    'use strict';
+
+    describe('mage/calendar', function () {
+        describe('Check calendar', function () {
+            var calendarSelector = '#calendar';
+
+            beforeEach(function () {
+                var $calendar = $('<input type="text" id="calendar" />');
+
+                $('body').append($calendar);
+            });
+
+            afterEach(function () {
+                $(calendarSelector).remove();
+                $(calendarSelector).calendar('destroy');
+            });
+
+            it('Check that calendar inited', function () {
+                var $calendar = $(calendarSelector).calendar();
+
+                expect($calendar.is(':mage-calendar')).toBe(true);
+            });
+
+            it('Check configuration merge', function () {
+                var $calendar;
+
+                $.extend(true, $, {
+                    calendarConfig: {
+                        showOn: 'button',
+                        showAnim: '',
+                        buttonImageOnly: true,
+                        showButtonPanel: true,
+                        showWeek: true,
+                        timeFormat: '',
+                        showTime: false,
+                        showHour: false,
+                        showMinute: false
+                    }
+                });
+
+                $calendar = $(calendarSelector).calendar();
+
+                expect($calendar.calendar('option', 'showOn')).toBe('button');
+                expect($calendar.calendar('option', 'showAnim')).toBe('');
+                expect($calendar.calendar('option', 'buttonImageOnly')).toBe(true);
+                expect($calendar.calendar('option', 'showButtonPanel')).toBe(true);
+                expect($calendar.calendar('option', 'showWeek')).toBe(true);
+                expect($calendar.calendar('option', 'timeFormat')).toBe('');
+                expect($calendar.calendar('option', 'showTime')).toBe(false);
+                expect($calendar.calendar('option', 'showHour')).toBe(false);
+                expect($calendar.calendar('option', 'showMinute')).toBe(false);
+
+                delete $.calendarConfig;
+            });
+
+            it('Specifying AM/PM in timeformat option changes AMPM option to true', function () {
+                var $calendar = $(calendarSelector).calendar({
+                    timeFormat: 'hh:mm tt',
+                    ampm: false
+                });
+
+                expect($calendar.calendar('option', 'ampm')).toBe(true);
+            });
+
+            it('Omitting AM/PM in timeformat option changes AMPM option to false', function () {
+                var $calendar = $(calendarSelector).calendar({
+                    timeFormat: 'hh:mm'
+                });
+
+                expect($calendar.calendar('option', 'ampm')).toBe(null);
+            });
+
+            it('With server timezone offset', function () {
+                var serverTimezoneSeconds = 1346122095,
+                    $calendar = $(calendarSelector).calendar({
+                        serverTimezoneSeconds: serverTimezoneSeconds
+                    }),
+                    currentDate = new Date();
+
+                currentDate.setTime((serverTimezoneSeconds + currentDate.getTimezoneOffset() * 60) * 1000);
+
+                expect($calendar.calendar('getTimezoneDate').toString()).toBe(currentDate.toString());
+            });
+
+            it('Without sever timezone offset', function () {
+                var $calendar = $(calendarSelector).calendar(),
+                    currentDate = new Date();
+
+                expect($calendar.calendar('getTimezoneDate').toString()).toBe(currentDate.toString());
+            });
+
+            it('Check destroy', function () {
+                var $calendar = $(calendarSelector).calendar();
+
+                expect($calendar.is(':mage-calendar')).toBe(true);
+                $calendar.calendar('destroy');
+                expect($calendar.is(':mage-calendar')).toBe(false);
+            });
+        });
+        describe('Check dateRange', function () {
+            var dateRangeSelector = '#date-range';
+
+            beforeEach(function () {
+                var $dateRange = $('<div id="date-range">' +
+                    '<input type="text" id="from" />' +
+                    '<input type="text" id="to" />' +
+                    '</div>');
+
+                $('body').append($dateRange);
+            });
+
+            afterEach(function () {
+                $(dateRangeSelector).remove();
+                $(dateRangeSelector).dateRange('destroy');
+            });
+
+            it('Check that dateRange inited', function () {
+                var $dateRange = $(dateRangeSelector).dateRange();
+
+                expect($dateRange.is(':mage-dateRange')).toBe(true);
+            });
+
+            it('Check that dateRange inited with additional options', function () {
+                var $from = $('#from'),
+                    $to = $('#to');
+
+                $(dateRangeSelector).dateRange({
+                    from: {
+                        id: 'from'
+                    },
+                    to: {
+                        id: 'to'
+                    }
+                });
+
+                expect($from.hasClass('_has-datepicker')).toBe(true);
+                expect($to.hasClass('_has-datepicker')).toBe(true);
+            });
+
+            it('Check destroy', function () {
+                var $dateRange = $(dateRangeSelector).dateRange({
+                        from: {
+                            id: 'from'
+                        },
+                        to: {
+                            id: 'to'
+                        }
+                    }),
+                    $from = $('#from'),
+                    $to = $('#to');
+
+                expect($dateRange.is(':mage-dateRange')).toBe(true);
+                expect($from.hasClass('_has-datepicker')).toBe(true);
+                expect($to.hasClass('_has-datepicker')).toBe(true);
+                $dateRange.dateRange('destroy');
+                expect($dateRange.is(':mage-dateRange')).toBe(false);
+                expect($from.hasClass('_has-datepicker')).toBe(false);
+                expect($to.hasClass('_has-datepicker')).toBe(false);
+            });
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/collapsible.test.js b/dev/tests/js/jasmine/tests/lib/mage/collapsible.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..d6c95d2887ec7c0706a2ec3b88f4f3fab3079fed
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/collapsible.test.js
@@ -0,0 +1,211 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+/* eslint-disable max-nested-callbacks */
+/* jscs:disable jsDoc */
+
+define([
+    'jquery',
+    'jquery/ui',
+    'mage/collapsible'
+], function ($) {
+    'use strict';
+
+    describe('Test for mage/collapsible jQuery plugin', function () {
+        it('check if collapsible can be initialized and destroyed', function () {
+            var group = $('<div id="1"></div>');
+
+            group.collapsible();
+            expect(group.is(':mage-collapsible')).toBeTruthy();
+
+            group.collapsible('destroy');
+            expect(group.is(':mage-collapsible')).toBeFalsy();
+            group.remove();
+        });
+
+        describe('Test enable, disable, activate and deactivate methods', function () {
+            var group = $('<div id="2"></div>'),
+                content = $('<div data-role="content"></div>').appendTo(group);
+
+            $('<div data-role="title"></div>').prependTo(group);
+
+            beforeEach(function () {
+                group.appendTo('body');
+            });
+
+            afterEach(function () {
+                group.remove();
+            });
+
+            it('check enable and disable methods', function () {
+                group.collapsible();
+                expect(group.is(':mage-collapsible')).toBeTruthy();
+
+                group.collapsible('disable');
+                expect(content.is(':hidden')).toBeTruthy();
+
+                group.collapsible('enable');
+                expect(content.is(':visible')).toBeTruthy();
+
+                group.collapsible('destroy');
+                expect(group.is(':mage-collapsible')).toBeFalsy();
+            });
+
+            it('check activate and deactivate methods', function () {
+                group.collapsible();
+                expect(group.is(':mage-collapsible')).toBeTruthy();
+
+                group.collapsible('deactivate');
+                expect(content.is(':hidden')).toBeTruthy();
+
+                group.collapsible('activate');
+                expect(content.is(':visible')).toBeTruthy();
+
+                group.collapsible('destroy');
+                expect(group.is(':mage-collapsible')).toBeFalsy();
+            });
+        });
+
+        it('check if the widget gets expanded/collapsed when the title is clicked', function () {
+            var group = $('<div id="3"></div>'),
+                title = $('<div data-role="title"></div>').appendTo(group),
+                content = $('<div data-role="content"></div>').appendTo(group);
+
+            group.appendTo('body');
+
+            group.collapsible();
+            expect(group.is(':mage-collapsible')).toBeTruthy();
+
+            group.collapsible('deactivate');
+            expect(content.is(':hidden')).toBeTruthy();
+
+            title.trigger('click');
+            expect(content.is(':visible')).toBeTruthy();
+
+            title.trigger('click');
+            expect(content.is(':hidden')).toBeTruthy();
+
+            group.collapsible('destroy');
+            expect(group.is(':mage-collapsible')).toBeFalsy();
+            group.remove();
+        });
+
+        it('check state classes', function () {
+            var group = $('<div id="4"></div>'),
+                title = $('<div data-role="title"></div>').appendTo(group);
+
+            $('<div data-role="content"></div>').appendTo(group);
+
+            group.appendTo('body');
+
+            group.collapsible({
+                openedState: 'opened',
+                closedState: 'closed',
+                disabledState: 'disabled'
+            });
+            expect(group.is(':mage-collapsible')).toBeTruthy();
+            expect(group.hasClass('closed')).toBeTruthy();
+
+            title.trigger('click');
+            expect(group.hasClass('opened')).toBeTruthy();
+
+            group.collapsible('disable');
+            expect(group.hasClass('disabled')).toBeTruthy();
+
+            group.collapsible('destroy');
+            expect(group.is(':mage-collapsible')).toBeFalsy();
+            group.remove();
+        });
+
+        it('check if icons are added to title when initialized and removed when destroyed', function () {
+            var group = $('<div id="5"></div>'),
+                title = $('<div data-role="title"></div>').appendTo(group);
+
+            $('<div data-role="content"></div>').appendTo(group);
+
+            group.appendTo('body');
+
+            group.collapsible({
+                icons: {
+                    header: 'minus',
+                    activeHeader: 'plus'
+                }
+            });
+            expect(group.is(':mage-collapsible')).toBeTruthy();
+            expect(title.children('[data-role=icons]').length).toBeTruthy();
+
+            group.collapsible('destroy');
+            expect(group.is(':mage-collapsible')).toBeFalsy();
+            expect(title.children('[data-role=icons]').length).toBeFalsy();
+            group.remove();
+        });
+
+        it('check if icon classes are changed when content gets expanded/collapsed', function () {
+            var group = $('<div id="6"></div>'),
+                title = $('<div data-role="title"></div>').appendTo(group),
+                content = $('<div data-role="content"></div>').appendTo(group),
+                icons;
+
+            group.appendTo('body');
+
+            group.collapsible({
+                icons: {
+                    header: 'minus',
+                    activeHeader: 'plus'
+                }
+            });
+            expect(group.is(':mage-collapsible')).toBeTruthy();
+
+            icons = group.collapsible('option', 'icons');
+            group.collapsible('deactivate');
+            expect(content.is(':hidden')).toBeTruthy();
+            expect(title.children('[data-role=icons]').hasClass(icons.header)).toBeTruthy();
+
+            title.trigger('click');
+            expect(title.children('[data-role=icons]').hasClass(icons.activeHeader)).toBeTruthy();
+
+            group.collapsible('destroy');
+            expect(group.is(':mage-collapsible')).toBeFalsy();
+            group.remove();
+        });
+
+        it('check if content gets updated via Ajax when title is clicked', function () {
+            var group = $('<div id="8"></div>'),
+                title = $('<div data-role="title"></div>').appendTo(group),
+                content = $('<div data-role="content"></div>').appendTo(group);
+
+            $('<a data-ajax="true" href="test.html"></a>').appendTo(group);
+
+            $.get = jasmine.createSpy().and.callFake(function () {
+                var d = $.Deferred();
+
+                d.promise().success = function () {
+                };
+
+                d.promise().complete = function () {
+                };
+
+                return d.promise();
+            });
+
+            group.appendTo('body');
+
+            group.collapsible({
+                ajaxContent: true
+            });
+            expect(group.is(':mage-collapsible')).toBeTruthy();
+
+            group.collapsible('deactivate');
+            expect(content.is(':hidden')).toBeTruthy();
+            expect(content.children('p').length).toBeFalsy();
+
+            title.trigger('click');
+            expect(content.children('p')).toBeTruthy();
+
+            group.collapsible('destroy');
+            expect(group.is(':mage-collapsible')).toBeFalsy();
+            group.remove();
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/decorate.test.js b/dev/tests/js/jasmine/tests/lib/mage/decorate.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..898bcf8b51128e62138190bc3d7dc4418705c19d
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/decorate.test.js
@@ -0,0 +1,201 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/* eslint-disable max-nested-callbacks */
+define([
+    'mage/decorate',
+    'jquery'
+], function (decorate, $) {
+    'use strict';
+
+    describe('mage/decorate', function () {
+        describe('"list" method', function () {
+            var listId = 'testList';
+
+            beforeEach(function () {
+                var list = $('<ul id="' + listId + '"><li/><li/><li/></ul>');
+
+                $('body').append(list);
+            });
+
+            afterEach(function () {
+                $('#' + listId).remove();
+            });
+
+            it('Check correct class decoration', function () {
+                var $list = $('#' + listId);
+
+                $list.decorate('list');
+                expect($list.find('li:first').hasClass('first')).toBe(false);
+                expect($list.find('li:first').hasClass('odd')).toBe(true);
+                expect($list.find('li:last').hasClass('last')).toBe(true);
+                expect($list.find('li:odd').hasClass('even')).toBe(true);
+                expect($list.find('li:even').hasClass('odd')).toBe(true);
+            });
+        });
+
+        describe('"generic" method', function () {
+            var listId = 'testList';
+
+            beforeEach(function () {
+                var list = $('<ul id="' + listId + '"><li/><li/><li/></ul>');
+
+                $('body').append(list);
+            });
+
+            afterEach(function () {
+                $('#' + listId).remove();
+            });
+
+            it('Check correct class decoration with default params', function () {
+                var $list = $('#' + listId);
+
+                $list.find('li').decorate('generic');
+                expect($list.find('li:first').hasClass('first')).toBe(true);
+                expect($list.find('li:first').hasClass('odd')).toBe(true);
+                expect($list.find('li:last').hasClass('last')).toBe(true);
+                expect($list.find('li:odd').hasClass('even')).toBe(true);
+                expect($list.find('li:even').hasClass('odd')).toBe(true);
+            });
+
+            it('Check correct class decoration with custom params', function () {
+                var $list = $('#' + listId);
+
+                $list.find('li').decorate('generic', ['last', 'first']);
+                expect($list.find('li:first').hasClass('first')).toBe(true);
+                expect($list.find('li:first').hasClass('odd')).toBe(false);
+                expect($list.find('li:last').hasClass('last')).toBe(true);
+                expect($list.find('li:odd').hasClass('even')).toBe(false);
+                expect($list.find('li:even').hasClass('odd')).toBe(false);
+            });
+
+            it('Check correct class decoration with empty items', function () {
+                var $list = $('#' + listId);
+
+                $list.find('span').decorate('generic', ['last', 'first']);
+                expect($list.find('li:first').hasClass('first')).toBe(false);
+                expect($list.find('li:first').hasClass('odd')).toBe(false);
+                expect($list.find('li:last').hasClass('last')).toBe(false);
+                expect($list.find('li:odd').hasClass('even')).toBe(false);
+                expect($list.find('li:even').hasClass('odd')).toBe(false);
+            });
+        });
+
+        describe('"table" method', function () {
+            var tableId = 'testTable';
+
+            beforeEach(function () {
+                var table = $('<table id="' + tableId + '">' +
+                    '<thead><tr><th/><th/></tr></thead>' +
+                    '<tbody>' +
+                    '<tr><td/><td/></tr>' +
+                    '<tr><td/><td/></tr>' +
+                    '<tr><td/><td/></tr>' +
+                    '</tbody>>' +
+                    '<tfoot><tr><th/><th/></tr></tfoot>' +
+                    '</table>');
+
+                $('body').append(table);
+            });
+
+            afterEach(function () {
+                $('#' + tableId).remove();
+            });
+
+            it('Check correct class decoration with default params', function () {
+                var $table = $('#' + tableId);
+
+                $table.decorate('table');
+                expect($table.find('tbody tr:first').hasClass('first')).toBe(true);
+                expect($table.find('tbody tr:first').hasClass('odd')).toBe(true);
+                expect($table.find('tbody tr:odd').hasClass('even')).toBe(true);
+                expect($table.find('tbody tr:even').hasClass('odd')).toBe(true);
+                expect($table.find('tbody tr:last').hasClass('last')).toBe(true);
+                expect($table.find('thead tr:first').hasClass('first')).toBe(true);
+                expect($table.find('thead tr:last').hasClass('last')).toBe(true);
+                expect($table.find('tfoot tr:first').hasClass('first')).toBe(true);
+                expect($table.find('tfoot tr:last').hasClass('last')).toBe(true);
+                expect($table.find('tr td:last').hasClass('last')).toBe(true);
+                expect($table.find('tr td:first').hasClass('first')).toBe(false);
+            });
+
+            it('Check correct class decoration with custom params', function () {
+                var $table = $('#' + tableId);
+
+                $table.decorate('table', {
+                    'tbody': ['first'],
+                    'tbody tr': ['first'],
+                    'thead tr': ['first'],
+                    'tfoot tr': ['last'],
+                    'tr td': ['first']
+                });
+                expect($table.find('tbody:first').hasClass('first')).toBe(true);
+                expect($table.find('tbody tr:first').hasClass('first')).toBe(true);
+                expect($table.find('tbody tr:first').hasClass('odd')).toBe(false);
+                expect($table.find('tbody tr:odd').hasClass('even')).toBe(false);
+                expect($table.find('tbody tr:even').hasClass('odd')).toBe(false);
+                expect($table.find('tbody tr:last').hasClass('last')).toBe(false);
+                expect($table.find('thead tr:first').hasClass('first')).toBe(true);
+                expect($table.find('thead tr:last').hasClass('last')).toBe(false);
+                expect($table.find('tfoot tr:first').hasClass('first')).toBe(false);
+                expect($table.find('tfoot tr:last').hasClass('last')).toBe(true);
+                expect($table.find('tr td:last').hasClass('last')).toBe(false);
+                expect($table.find('tr td:first').hasClass('first')).toBe(true);
+            });
+        });
+
+        describe('"dataList" method', function () {
+            var listId = 'testDataList';
+
+            beforeEach(function () {
+                var list = $('<dl id="' + listId + '"><dt/><dd/><dt/><dd/><dt/><dd/></dl>');
+
+                $('body').append(list);
+            });
+
+            afterEach(function () {
+                $('#' + listId).remove();
+            });
+
+            it('Check correct class decoration', function () {
+                var $list = $('#' + listId);
+
+                $list.decorate('dataList');
+                expect($list.find('dt:first').hasClass('first')).toBe(false);
+                expect($list.find('dt:first').hasClass('odd')).toBe(true);
+                expect($list.find('dt:odd').hasClass('even')).toBe(true);
+                expect($list.find('dt:even').hasClass('odd')).toBe(true);
+                expect($list.find('dt:last').hasClass('last')).toBe(true);
+                expect($list.find('dd:first').hasClass('first')).toBe(false);
+                expect($list.find('dd:first').hasClass('odd')).toBe(true);
+                expect($list.find('dd:odd').hasClass('even')).toBe(true);
+                expect($list.find('dd:even').hasClass('odd')).toBe(true);
+                expect($list.find('dd:last').hasClass('last')).toBe(true);
+            });
+        });
+
+        describe('Call decorate with fake method', function () {
+            var listId = 'testDataList';
+
+            beforeEach(function () {
+                var list = $('<dl id="' + listId + '"><dt/><dd/><dt/><dd/><dt/><dd/></dl>');
+
+                $('body').append(list);
+            });
+
+            afterEach(function () {
+                $('#' + listId).remove();
+            });
+
+            it('Check error message', function () {
+                var $list = $('#' + listId);
+
+                spyOn($, 'error');
+                $list.decorate('customMethod');
+                expect($.error).toHaveBeenCalledWith('Method customMethod does not exist on jQuery.decorate');
+            });
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/dropdown.test.js b/dev/tests/js/jasmine/tests/lib/mage/dropdown.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..1d149efe040e0f71951d833ce132ffbb098288a4
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/dropdown.test.js
@@ -0,0 +1,357 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+/* eslint-disable max-nested-callbacks */
+
+define([
+    'jquery',
+    'mage/dropdown'
+], function ($) {
+    'use strict';
+
+    describe('Test for mage/dropdown jQuery plugin', function () {
+        it('check if dialog opens when the triggerEvent is triggered', function () {
+            var opener = $('<div/>'),
+                dialog = $('<div/>');
+
+            dialog.dropdownDialog({
+                'triggerEvent': 'click',
+                'triggerTarget': opener
+            });
+
+            opener.trigger('click');
+            expect(dialog.dropdownDialog('isOpen')).toBeTruthy();
+
+            dialog.dropdownDialog('destroy');
+
+            dialog.dropdownDialog({
+                'triggerEvent': null,
+                'triggerTarget': opener
+            });
+
+            opener.trigger('click');
+            expect(dialog.dropdownDialog('isOpen')).toBeFalsy();
+            dialog.dropdownDialog('destroy');
+        });
+
+        it('check if a specified class is added to the trigger', function () {
+            var opener = $('<div/>'),
+                dialog = $('<div/>');
+
+            dialog.dropdownDialog({
+                'triggerClass': 'active',
+                'triggerTarget': opener
+            });
+
+            dialog.dropdownDialog('open');
+            expect(opener.hasClass('active')).toBeTruthy();
+
+            dialog.dropdownDialog('close');
+            dialog.dropdownDialog('destroy');
+
+            dialog.dropdownDialog({
+                'triggerClass': null,
+                'triggerTarget': opener
+            });
+
+            dialog.dropdownDialog('open');
+            expect(opener.hasClass('active')).toBeFalsy();
+
+            dialog.dropdownDialog('close');
+            dialog.dropdownDialog('destroy');
+        });
+
+        it('check if a specified class is added to the element which the dialog appends to', function () {
+            var parent = $('<div/>'),
+                dialog = $('<div/>');
+
+            dialog.dropdownDialog({
+                'parentClass': 'active',
+                'appendTo': parent
+            });
+
+            dialog.dropdownDialog('open');
+            expect(parent.hasClass('active')).toBeTruthy();
+
+            dialog.dropdownDialog('close');
+            dialog.dropdownDialog('destroy');
+
+            dialog.dropdownDialog({
+                'parentClass': null,
+                'appendTo': parent
+            });
+
+            dialog.dropdownDialog('open');
+            expect(parent.hasClass('active')).toBeFalsy();
+
+            dialog.dropdownDialog('close');
+            dialog.dropdownDialog('destroy');
+        });
+
+        it('check if a specified class is added to the element that becomes dialog', function () {
+            var dialog = $('<div/>'),
+                content;
+
+            dialog.dropdownDialog({
+                'dialogContentClass': 'active'
+            });
+
+            content = $('.ui-dialog-content');
+            dialog.dropdownDialog('open');
+            expect(content.hasClass('active')).toBeTruthy();
+
+            dialog.dropdownDialog('close');
+            dialog.dropdownDialog('destroy');
+
+            dialog.dropdownDialog({
+                'dialogContentClass': null
+            });
+
+            dialog.dropdownDialog('open');
+            expect(content.hasClass('active')).toBeFalsy();
+
+            dialog.dropdownDialog('close');
+            dialog.dropdownDialog('destroy');
+        });
+
+        it('check if a specified class is added to dialog', function () {
+            var dialog = $('<div/>'),
+                uiClass = '.ui-dialog',
+                ui;
+
+            dialog.dropdownDialog({
+                'defaultDialogClass': 'custom'
+            });
+
+            ui = $(uiClass);
+            expect(ui.hasClass('custom')).toBeTruthy();
+            expect(ui.hasClass('mage-dropdown-dialog')).toBeFalsy();
+
+            dialog.dropdownDialog('destroy');
+
+            dialog.dropdownDialog({});
+            ui = $(uiClass);
+            expect(ui.hasClass('mage-dropdown-dialog')).toBeTruthy();
+
+            dialog.dropdownDialog('destroy');
+        });
+
+        it('check if the specified trigger actually opens the dialog', function () {
+            var opener = $('<div/>'),
+                dialog = $('<div/>');
+
+            dialog.dropdownDialog({
+                'triggerTarget': opener
+            });
+
+            opener.trigger('click');
+            expect(dialog.dropdownDialog('isOpen')).toBeTruthy();
+
+            dialog.dropdownDialog('close');
+            dialog.dropdownDialog('destroy');
+
+            dialog.dropdownDialog({
+                'triggerTarget': null
+            });
+
+            opener.trigger('click');
+            expect(dialog.dropdownDialog('isOpen')).toBeFalsy();
+
+            dialog.dropdownDialog('destroy');
+        });
+
+        it('check if the dialog gets closed when clicking outside of it', function () {
+            var container = $('<div/>'),
+                outside = $('<div/>').attr('id', 'outside').appendTo(container),
+                dialog = $('<div/>').attr('id', 'dialog').appendTo(container);
+
+            container.appendTo('body');
+
+            dialog.dropdownDialog({
+                'closeOnClickOutside': true
+            });
+
+            dialog.dropdownDialog('open');
+            outside.trigger('click');
+            expect(dialog.dropdownDialog('isOpen')).toBeFalsy();
+
+            dialog.dropdownDialog('destroy');
+
+            dialog.dropdownDialog({
+                'closeOnClickOutside': false
+            });
+
+            dialog.dropdownDialog('open');
+            outside.trigger('click');
+            expect(dialog.dropdownDialog('isOpen')).toBeTruthy();
+
+            dialog.dropdownDialog('destroy');
+        });
+
+        it('check if the dialog gets closed when mouse leaves the dialog area', function () {
+            var container = $('<div/>'),
+                dialog = $('<div/>').attr('id', 'dialog').appendTo(container);
+
+            $('<div/>').attr('id', 'outside').appendTo(container);
+            $('<div/>').attr('id', 'opener').appendTo(container);
+
+            container.appendTo('body');
+
+            jasmine.clock().install();
+
+            dialog.dropdownDialog({
+                'closeOnMouseLeave': true
+            });
+
+            dialog.dropdownDialog('open');
+            dialog.trigger('mouseenter');
+            expect(dialog.dropdownDialog('isOpen')).toBeTruthy();
+
+            dialog.trigger('mouseleave');
+
+            jasmine.clock().tick(10);
+
+            expect(dialog.dropdownDialog('isOpen')).toBeFalsy();
+            dialog.dropdownDialog('destroy');
+
+            jasmine.clock().uninstall();
+        });
+
+        it('check if the dialog does not close when mouse leaves the dialog area', function () {
+            var container = $('<div/>'),
+                dialog = $('<div/>').attr('id', 'dialog').appendTo(container);
+
+            $('<div/>').attr('id', 'outside').appendTo(container);
+            $('<div/>').attr('id', 'opener').appendTo(container);
+
+            container.appendTo('body');
+
+            jasmine.clock().install();
+
+            dialog.dropdownDialog({
+                'closeOnMouseLeave': false
+            });
+
+            dialog.dropdownDialog('open');
+            dialog.trigger('mouseenter');
+            dialog.trigger('mouseleave');
+            jasmine.clock().tick(10);
+            expect(dialog.dropdownDialog('isOpen')).toBeTruthy();
+            dialog.dropdownDialog('destroy');
+
+            jasmine.clock().uninstall();
+        });
+
+        it('check if the dialog gets closed with the specified delay', function (done) {
+            var container = $('<div/>'),
+                dialog = $('<div/>').attr('id', 'dialog').appendTo(container);
+
+            $('<div/>').attr('id', 'outside').appendTo(container);
+            $('<div/>').attr('id', 'opener').appendTo(container);
+
+            container.appendTo('body');
+
+            dialog.dropdownDialog({
+                'timeout': 5
+            });
+
+            dialog.dropdownDialog('open');
+            dialog.trigger('mouseenter');
+            dialog.trigger('mouseleave');
+            expect(dialog.dropdownDialog('isOpen')).toBeTruthy();
+
+            setTimeout(function () {
+                expect(dialog.dropdownDialog('isOpen')).toBeFalsy();
+                dialog.dropdownDialog('destroy');
+                done();
+            }, 6);
+        });
+
+        /*
+         * jQuery ui version 1.9.2 belongs to the adminhtml.
+         *
+         * This test will fail on backend since backend's jquery.ui will
+         * add ui-dialog-titlebar class anyway on create.
+         */
+        if ($.ui.version !== '1.9.2') {
+            it('check if the title bar is prevented from being created', function () {
+                var dialog = $('<div/>'),
+                    uiClass = '.ui-dialog',
+                    ui;
+
+                dialog.dropdownDialog({
+                    'createTitleBar': true
+                });
+
+                ui = $(uiClass);
+                expect(ui.find('.ui-dialog-titlebar').length > 0).toBeTruthy();
+
+                dialog.dropdownDialog('destroy');
+
+                dialog.dropdownDialog({
+                    'createTitleBar': false
+                });
+
+                ui = $(uiClass);
+                expect(ui.find('.ui-dialog-titlebar').length <= 0).toBeTruthy();
+
+                dialog.dropdownDialog('destroy');
+            });
+        }
+
+        it('check if the position function gets disabled', function () {
+            var dialog = $('<div/>'),
+                uiClass = '.ui-dialog',
+                ui;
+
+            dialog.dropdownDialog({
+                'autoPosition': false
+            });
+
+            ui = $(uiClass);
+            dialog.dropdownDialog('open');
+            expect(ui.css('top') === 'auto').toBeTruthy();
+
+            dialog.dropdownDialog('destroy');
+
+            dialog.dropdownDialog({
+                'autoPosition': true
+            });
+
+            ui = $(uiClass);
+            dialog.dropdownDialog('open');
+            expect(ui.css('top') !== '0px').toBeTruthy();
+
+            dialog.dropdownDialog('destroy');
+        });
+
+        it('check if the size function gets disabled', function () {
+            var dialog = $('<div/>'),
+                uiClass = '.ui-dialog',
+                ui;
+
+            dialog.dropdownDialog({
+                'autoSize': true,
+                'width': '300'
+            });
+
+            ui = $(uiClass);
+            dialog.dropdownDialog('open');
+            expect(ui.css('width') === '300px').toBeTruthy();
+
+            dialog.dropdownDialog('destroy');
+
+            dialog.dropdownDialog({
+                'autoSize': false,
+                'width': '300'
+            });
+
+            ui = $(uiClass);
+            dialog.dropdownDialog('open');
+            expect(ui.css('width') === '300px').toBeFalsy();
+
+            dialog.dropdownDialog('destroy');
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/form.test.js b/dev/tests/js/jasmine/tests/lib/mage/form.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..6202f93da999af79ac6d7b98267e40ac05e727b2
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/form.test.js
@@ -0,0 +1,262 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+/* eslint-disable max-nested-callbacks */
+/* jscs:disable jsDoc */
+
+define([
+    'jquery',
+    'mage/backend/form'
+], function ($) {
+    'use strict';
+
+    /*
+     * jQuery ui version 1.9.2 belongs to the adminhtml.
+     *
+     * This test will fail on frontend since mage/backend/form only belongs to backend.
+     */
+    if ($.ui.version === '1.9.2') {
+        describe('Test for mage/form jQuery plugin', function () {
+            var id = 'edit_form',
+                elementId = '#' + id;
+
+            beforeEach(function () {
+                var element = $('<form id="' + id + '" action="action/url" method="GET" target="_self" ></form>');
+
+                element.appendTo('body');
+            });
+
+            afterEach(function () {
+                $(elementId).remove();
+            });
+
+            it('check if form can be initialized', function () {
+                var form = $(elementId).form();
+
+                expect(form.is(':mage-form')).toBeTruthy();
+            });
+
+            it('check get handlers', function () {
+                var form = $(elementId).form(),
+                    handlersData = form.form('option', 'handlersData'),
+                    handlers = [];
+
+                $.each(handlersData, function (key) {
+                    handlers.push(key);
+                });
+                expect(handlers.join(' ')).toBe(form.data('form')._getHandlers().join(' '));
+            });
+
+            it('check store attribute', function () {
+                var form = $(elementId).form(),
+                    initialFormAttrs = {
+                        action: form.attr('action'),
+                        target: form.attr('target'),
+                        method: form.attr('method')
+                    };
+
+                form.data('form')._storeAttribute('action');
+                form.data('form')._storeAttribute('target');
+                form.data('form')._storeAttribute('method');
+
+                expect(form.data('form').oldAttributes.action).toBe(initialFormAttrs.action);
+                expect(form.data('form').oldAttributes.target).toBe(initialFormAttrs.target);
+                expect(form.data('form').oldAttributes.method).toBe(initialFormAttrs.method);
+            });
+
+            it('check bind', function () {
+                var form = $(elementId).form(),
+                    submitted = false,
+                    handlersData = form.form('option', 'handlersData');
+
+                form.on('submit', function (e) {
+                    submitted = true;
+                    e.stopImmediatePropagation();
+                    e.preventDefault();
+                });
+
+                $.each(handlersData, function (key) {
+                    form.trigger(key);
+                    expect(submitted).toBeTruthy();
+                    submitted = false;
+                });
+
+                form.off('submit');
+            });
+
+            it('check get action URL', function () {
+                var form = $(elementId).form(),
+                    action = form.attr('action'),
+                    testUrl = 'new/action/url',
+                    testArgs = {
+                        args: {
+                            arg: 'value'
+                        }
+                    };
+
+                form.data('form')._storeAttribute('action');
+                expect(form.data('form')._getActionUrl(testArgs)).toBe(action + '/arg/value/');
+                expect(form.data('form')._getActionUrl(testUrl)).toBe(testUrl);
+                expect(form.data('form')._getActionUrl()).toBe(action);
+            });
+
+            it('check process data', function () {
+                var form = $(elementId).form(),
+                    initialFormAttrs = {
+                        action: form.attr('action'),
+                        target: form.attr('target'),
+                        method: form.attr('method')
+                    },
+                    testSimpleData = {
+                        action: 'new/action/url',
+                        target: '_blank',
+                        method: 'POST'
+                    },
+                    testActionArgsData = {
+                        action: {
+                            args: {
+                                arg: 'value'
+                            }
+                        }
+                    },
+                    processedData = form.data('form')._processData(testSimpleData);
+
+                expect(form.data('form').oldAttributes.action).toBe(initialFormAttrs.action);
+                expect(form.data('form').oldAttributes.target).toBe(initialFormAttrs.target);
+                expect(form.data('form').oldAttributes.method).toBe(initialFormAttrs.method);
+                expect(processedData.action).toBe(testSimpleData.action);
+                expect(processedData.target).toBe(testSimpleData.target);
+                expect(processedData.method).toBe(testSimpleData.method);
+
+                form.data('form')._rollback();
+                processedData = form.data('form')._processData(testActionArgsData);
+                form.data('form')._storeAttribute('action');
+                expect(processedData.action).toBe(form.data('form')._getActionUrl(testActionArgsData.action));
+            });
+
+            it('check before submit', function () {
+                var testForm = $('<form id="test-form"></form>').appendTo('body'),
+                    testHandler = {
+                        action: {
+                            args: {
+                                arg1: 'value1'
+                            }
+                        }
+                    },
+                    form = $(elementId).form({
+                        handlersData: {
+                            testHandler: testHandler
+                        }
+                    }),
+                    beforeSubmitData = {
+                        action: {
+                            args: {
+                                arg2: 'value2'
+                            }
+                        },
+                        target: '_blank'
+                    },
+                    eventData = {
+                        method: 'POST'
+                    },
+                    resultData = $.extend(true, {}, testHandler, beforeSubmitData, eventData);
+
+                form.data('form')._storeAttribute('action');
+                resultData = form.data('form')._processData(resultData);
+                testForm.prop(resultData);
+
+                form.on('beforeSubmit', function (e, data) {
+                    $.extend(data, beforeSubmitData);
+                });
+
+                form.on('submit', function (e) {
+                    e.stopImmediatePropagation();
+                    e.preventDefault();
+                });
+
+                form.data('form')._beforeSubmit('testHandler', eventData);
+                expect(testForm.prop('action')).toBe(form.prop('action'));
+                expect(testForm.prop('target')).toBe(form.prop('target'));
+                expect(testForm.prop('method')).toBe(form.prop('method'));
+            });
+
+            it('check submit', function () {
+                var formSubmitted = false,
+                    form = $(elementId).form({
+                        handlersData: {
+                            save: {}
+                        }
+                    });
+
+                form.data('form')._storeAttribute('action');
+                form.data('form')._storeAttribute('target');
+                form.data('form')._storeAttribute('method');
+
+                form.on('submit', function (e) {
+                    e.preventDefault();
+                    e.stopImmediatePropagation();
+                    e.preventDefault();
+                    formSubmitted = true;
+                }).prop({
+                    action: 'new/action/url',
+                    target: '_blank',
+                    method: 'POST'
+                });
+
+                form.data('form')._submit({
+                    type: 'save'
+                });
+
+                expect(form.attr('action')).toBe(form.data('form').oldAttributes.action);
+                expect(form.attr('target')).toBe(form.data('form').oldAttributes.target);
+                expect(form.attr('method')).toBe(form.data('form').oldAttributes.method);
+                expect(formSubmitted).toBeTruthy();
+
+                form.off('submit');
+            });
+
+            it('check build URL', function () {
+                var dataProvider = [
+                        {
+                            params: ['http://domain.com//', {
+                                'key[one]': 'value 1',
+                                'key2': '# value'
+                            }],
+                            expected: 'http://domain.com/key[one]/value%201/key2/%23%20value/'
+                        },
+                        {
+                            params: ['http://domain.com', {
+                                'key[one]': 'value 1',
+                                'key2': '# value'
+                            }],
+                            expected: 'http://domain.com/key[one]/value%201/key2/%23%20value/'
+                        },
+                        {
+                            params: ['http://domain.com?some=param', {
+                                'key[one]': 'value 1',
+                                'key2': '# value'
+                            }],
+                            expected: 'http://domain.com?some=param&key[one]=value%201&key2=%23%20value'
+                        },
+                        {
+                            params: ['http://domain.com?some=param&', {
+                                'key[one]': 'value 1',
+                                'key2': '# value'
+                            }],
+                            expected: 'http://domain.com?some=param&key[one]=value%201&key2=%23%20value'
+                        }
+                    ],
+                    method = $.mage.form._proto._buildURL,
+                    quantity = dataProvider.length,
+                    i = 0;
+
+                expect(quantity).toBeTruthy();
+
+                for (i; i < quantity; i++) {
+                    expect(dataProvider[i].expected).toBe(method.apply(null, dataProvider[i].params));
+                }
+            });
+        });
+    }
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/loader.test.js b/dev/tests/js/jasmine/tests/lib/mage/loader.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..93dd2ee91902c4755fd25161c6e8a8f7ca451aa0
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/loader.test.js
@@ -0,0 +1,79 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/* eslint-disable max-nested-callbacks */
+define([
+    'jquery',
+    'mage/loader'
+], function ($) {
+    'use strict';
+
+    describe('mage/loader', function () {
+        describe('Check loader', function () {
+            var loaderSelector = '#loader';
+
+            beforeEach(function () {
+                var $loader = $('<div id="loader"/>');
+
+                $('body').append($loader);
+            });
+
+            afterEach(function () {
+                $(loaderSelector).remove();
+                $(loaderSelector).loader('destroy');
+            });
+
+            it('Check that loader inited', function () {
+                var $loader = $(loaderSelector).loader({
+                    icon: 'icon.gif'
+                });
+
+                $loader.loader('show');
+
+                expect($loader.is(':mage-loader')).toBe(true);
+                expect($loader.find('p').text()).toBe('Please wait...');
+                expect($loader.find('img').prop('src').split('/').pop()).toBe('icon.gif');
+                expect($loader.find('img').prop('alt')).toBe('Loading...');
+            });
+
+            it('Body init', function () {
+                var $loader = $('body').loader();
+
+                $loader.loader('show');
+
+                expect($loader.is(':mage-loader')).toBe(true);
+                $loader.loader('destroy');
+            });
+
+            it('Check show/hide', function () {
+                var $loader = $(loaderSelector).loader(),
+                    $loadingMask;
+
+                $loader.loader('show');
+                $loadingMask = $('.loading-mask');
+                expect($loadingMask.is(':visible')).toBe(true);
+
+                $loader.loader('hide');
+                expect($loadingMask.is(':hidden')).toBe(true);
+
+                $loader.loader('show');
+                $loader.trigger('processStop');
+                expect($loadingMask.is(':hidden')).toBe(true);
+            });
+
+            it('Check destroy', function () {
+                var $loader = $(loaderSelector).loader(),
+                    $loadingMask;
+
+                $loader.loader('show');
+                $loadingMask = $('.loading-mask');
+                expect($loadingMask.is(':visible')).toBe(true);
+
+                $loader.loader('destroy');
+                expect($loadingMask.is(':visible')).toBe(false);
+            });
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/menu.test.js b/dev/tests/js/jasmine/tests/lib/mage/menu.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..69d8af4ff3dbac9a4cbf544d1dc853cc4290bc8d
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/menu.test.js
@@ -0,0 +1,110 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/* eslint-disable max-nested-callbacks */
+define([
+    'jquery',
+    'mage/menu',
+    'text!tests/assets/lib/web/mage/menu.html'
+], function ($, menu, menuTmpl) {
+    'use strict';
+
+    describe('mage/menu', function () {
+        describe('Menu expanded', function () {
+            var menuSelector = '#menu';
+
+            beforeEach(function () {
+                var $menu = $(menuTmpl);
+
+                $('body').append($menu);
+            });
+
+            afterEach(function () {
+                $(menuSelector).remove();
+            });
+
+            it('Check that menu expanded', function () {
+                var $menu = $(menuSelector),
+                    $menuItems = $menu.find('li'),
+                    $submenu = $menuItems.find('ul');
+
+                menu.menu({
+                    expanded: true
+                }, $menu);
+                expect($submenu.hasClass('expanded')).toBe(true);
+            });
+        });
+
+        describe('Menu hover event', function () {
+            var menuSelector = '#menu',
+                $menu;
+
+            beforeEach(function () {
+                var $menuObject = $(menuTmpl);
+
+                $('body').append($menuObject);
+                $menu = $(menuSelector).menu({
+                    delay: 0,
+                    showDelay: 0,
+                    hideDelay: 0
+                });
+            });
+
+            afterEach(function () {
+                $(menuSelector).remove();
+            });
+
+            it('Check that menu expanded', function (done) {
+                var $menuItem = $menu.find('li.test-menu-item'),
+                    $submenu = $menuItem.find('ul');
+
+                $menuItem.trigger('mouseover');
+                setTimeout(function () {
+                    expect($submenu.attr('aria-expanded')).toBe('true');
+                    $menuItem.trigger('mouseout');
+                    setTimeout(function () {
+                        expect($submenu.attr('aria-expanded')).toBe('false');
+                        done();
+                    }, 300);
+                }, 300);
+            });
+        });
+
+        describe('Menu navigation', function () {
+            var menuSelector = '#menu',
+                $menu;
+
+            beforeEach(function () {
+                var $menuObject = $(menuTmpl);
+
+                $('body').append($menuObject);
+                $menu = $(menuSelector).menu();
+            });
+
+            afterEach(function () {
+                $(menuSelector).remove();
+            });
+
+            it('Check max item limit', function () {
+                var $menuItems;
+
+                $menu.navigation({
+                    maxItems: 3
+                });
+                $menuItems = $menu.find('li:visible');
+
+                expect($menuItems.length).toBe(4);
+            });
+
+            it('Check that More Menu item will be added', function () {
+                $menu.navigation({
+                    responsive: 'onResize'
+                });
+
+                expect($('body').find('.ui-menu-more').length).toBeGreaterThan(0);
+            });
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/tabs.test.js b/dev/tests/js/jasmine/tests/lib/mage/tabs.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..a6138df073434c2e9bf4f12c3c23425ec68976f4
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/tabs.test.js
@@ -0,0 +1,93 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/* eslint-disable max-nested-callbacks */
+define([
+    'jquery',
+    'jquery/ui',
+    'mage/tabs',
+    'text!tests/assets/lib/web/mage/tabs.html'
+], function ($, ui, tabs, tabsTmpl) {
+    'use strict';
+
+    describe('mage/tabs', function () {
+        var tabsSelector = '#tabs';
+
+        beforeEach(function () {
+            var $tabs = $(tabsTmpl);
+
+            $('body').append($tabs);
+        });
+
+        afterEach(function () {
+            $(tabsSelector).remove();
+            $(tabsSelector).tabs('destroy');
+        });
+
+        it('Check tabs inited', function () {
+            var $tabs = $(tabsSelector).tabs();
+
+            expect($tabs.is(':mage-tabs')).toBe(true);
+        });
+
+        it('Check tabs collapsible inited', function () {
+            var $title1 = $('#title1'),
+                $title2 = $('#title2');
+
+            $(tabsSelector).tabs();
+
+            expect($title1.is(':mage-collapsible')).toBe(true);
+            expect($title2.is(':mage-collapsible')).toBe(true);
+        });
+
+        it('Check tabs active', function () {
+            var $content1 = $('#content1'),
+                $content2 = $('#content2');
+
+            $(tabsSelector).tabs({
+                active: 1
+            });
+
+            expect($content1.is(':hidden')).toBe(true);
+            expect($content2.is(':visible')).toBe(true);
+        });
+
+        it('Check tabs closing others tabs when one gets activated', function () {
+            var $title2 = $('#title2'),
+                $content1 = $('#content1'),
+                $content2 = $('#content2');
+
+            $(tabsSelector).tabs();
+
+            expect($content1.is(':visible')).toBe(true);
+            expect($content2.is(':hidden')).toBe(true);
+
+            $title2.trigger('click');
+
+            expect($content1.is(':hidden')).toBe(true);
+            expect($content2.is(':visible')).toBe(true);
+        });
+
+        it('Check tabs enable,disable,activate,deactivate options', function () {
+            var $title1 = $('#title1'),
+                $content1 = $('#content1'),
+                $tabs = $(tabsSelector).tabs();
+
+            expect($content1.is(':visible')).toBe(true);
+            $tabs.tabs('deactivate', 0);
+            expect($content1.is(':hidden')).toBe(true);
+            $tabs.tabs('activate', 0);
+            expect($content1.is(':visible')).toBe(true);
+            $tabs.tabs('disable', 0);
+            expect($content1.is(':hidden')).toBe(true);
+            $title1.trigger('click');
+            expect($content1.is(':hidden')).toBe(true);
+            $tabs.tabs('enable', 0);
+            expect($content1.is(':visible')).toBe(true);
+            $title1.trigger('click');
+            expect($content1.is(':visible')).toBe(true);
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/translate-inline.test.js b/dev/tests/js/jasmine/tests/lib/mage/translate-inline.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..bcdfc4cc59705dc07ed412b7e7ad4bb4a944f1d6
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/translate-inline.test.js
@@ -0,0 +1,111 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/* eslint-disable max-nested-callbacks */
+define([
+    'jquery',
+    'mage/translate-inline',
+    'text!tests/assets/lib/web/mage/translate-inline.html'
+], function ($, TranslateInline, translateTmpl) {
+    'use strict';
+
+    describe('mage/translate-inline', function () {
+        describe('Check translate', function () {
+            var translateSelector = '[data-role="translate-dialog"]',
+                translateTemplateSelector = '#translate-form-template';
+
+            beforeEach(function () {
+                var translateBlock = $(translateTmpl);
+
+                $('body').append(translateBlock);
+            });
+
+            afterEach(function () {
+                $(translateSelector).remove();
+                $(translateSelector).translateInline('destroy');
+                $(translateTemplateSelector).remove();
+            });
+
+            it('Check that translate inited', function () {
+                var translateInline = $(translateSelector).translateInline();
+
+                expect(translateInline.is(':mage-translateInline')).toBe(true);
+            });
+
+            it('Check that translate hidden on init and visible on trigger', function () {
+                var translateInline = $(translateSelector).translateInline({
+                        id: 'dialog-id'
+                    }),
+                    isDialogHiddenOnInit = translateInline.is(':hidden'),
+                    dialogVisibleAfterTriggerEdit;
+
+                translateInline.trigger('edit.editTrigger');
+                dialogVisibleAfterTriggerEdit = translateInline.is(':visible');
+                expect(isDialogHiddenOnInit).toBe(true);
+                expect(dialogVisibleAfterTriggerEdit).toBe(true);
+            });
+
+            it('Check translation form template', function () {
+                var translateFormId = 'translate-form-id',
+                    translateFormContent = 'New Template Variable',
+                    translateInline = $(translateSelector).translateInline({
+                        translateForm: {
+                            data: {
+                                id: translateFormId,
+                                newTemplateVariable: translateFormContent
+                            }
+                        }
+                    }),
+                    $translateForm;
+
+                translateInline.trigger('edit.editTrigger');
+                $translateForm = $('#' + translateFormId);
+
+                expect($translateForm.length).toBeGreaterThan(0);
+                expect($translateForm.text()).toBe(translateFormContent);
+            });
+
+            it('Check translation submit', function () {
+                var options = {
+                        ajaxUrl: 'www.test.com',
+                        area: 'test',
+                        translateForm: {
+                            template: '<form id="<%= data.id %>"><input name="test" value="test" /></form>',
+                            data: {
+                                id: 'translate-form-id'
+                            }
+                        }
+                    },
+                    expectedEequestData = 'area=test&test=test',
+                    translateInline = $(translateSelector).translateInline(options),
+                    $submitButton = $('body').find('.action-primary'),
+                    originalAjax = $.ajax;
+
+                $.ajax = jasmine.createSpy().and.callFake(function (request) {
+                    expect(request.url).toBe(options.ajaxUrl);
+                    expect(request.type).toBe('POST');
+                    expect(request.data).toBe(expectedEequestData);
+
+                    return {
+                        complete: jasmine.createSpy()
+                    };
+                });
+
+                translateInline.trigger('edit.editTrigger');
+                $submitButton.trigger('click');
+                $.ajax = originalAjax;
+            });
+
+            it('Check translation destroy', function () {
+                var translateInline = $(translateSelector).translateInline();
+
+                translateInline.trigger('edit.editTrigger');
+                expect(translateInline.is(':mage-translateInline')).toBe(true);
+                translateInline.translateInline('destroy');
+                expect(translateInline.is(':mage-translateInline')).toBe(false);
+            });
+        });
+    });
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/translate.test.js b/dev/tests/js/jasmine/tests/lib/mage/translate.test.js
new file mode 100644
index 0000000000000000000000000000000000000000..c87cfa227c1aade2915a73061a2aa037dfd2f6f7
--- /dev/null
+++ b/dev/tests/js/jasmine/tests/lib/mage/translate.test.js
@@ -0,0 +1,49 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+/* eslint-disable max-nested-callbacks */
+define([
+    'jquery',
+    'mage/translate'
+], function ($) {
+    'use strict';
+
+    describe('Test for mage/translate jQuery plugin', function () {
+        it('works with one string as parameter', function () {
+            $.mage.translate.add('Hello World!');
+            expect('Hello World!').toEqual($.mage.translate.translate('Hello World!'));
+        });
+        it('works with one array as parameter', function () {
+            $.mage.translate.add(['Hello World!', 'Bonjour tout le monde!']);
+            expect('Hello World!').toEqual($.mage.translate.translate('Hello World!'));
+        });
+        it('works with one object as parameter', function () {
+            var translation = {
+                'Hello World!': 'Bonjour tout le monde!'
+            };
+
+            $.mage.translate.add(translation);
+            expect(translation['Hello World!']).toEqual($.mage.translate.translate('Hello World!'));
+
+            translation = {
+                'Hello World!': 'Hallo Welt!',
+                'Some text with symbols!-+"%#*': 'Ein Text mit Symbolen!-+"%#*'
+            };
+
+            $.mage.translate.add(translation);
+            $.each(translation, function (key) {
+                expect(translation[key]).toEqual($.mage.translate.translate(key));
+            });
+        });
+        it('works with two string as parameter', function () {
+            $.mage.translate.add('Hello World!', 'Bonjour tout le monde!');
+            expect('Bonjour tout le monde!').toEqual($.mage.translate.translate('Hello World!'));
+        });
+        it('works with translation alias __', function () {
+            $.mage.translate.add('Hello World!');
+            expect('Hello World!').toEqual($.mage.__('Hello World!'));
+        });
+    });
+
+});
diff --git a/dev/tests/js/jasmine/tests/lib/mage/validation.test.js b/dev/tests/js/jasmine/tests/lib/mage/validation.test.js
index 12138e5939a7b1bdc487f3a27f7e003930287c48..ccf3591be0dfe7c13c196f0fb2adbe2498a8e55e 100644
--- a/dev/tests/js/jasmine/tests/lib/mage/validation.test.js
+++ b/dev/tests/js/jasmine/tests/lib/mage/validation.test.js
@@ -255,4 +255,891 @@ define([
         });
     });
 
+    describe('Testing validate-no-html-tags', function () {
+        it('validate-no-html-tags', function () {
+            expect($.validator.methods['validate-no-html-tags']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-no-html-tags']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-no-html-tags']
+                .call($.validator.prototype, 'abc')).toEqual(true);
+            expect($.validator.methods['validate-no-html-tags']
+                .call($.validator.prototype, '<div>abc</div>')).toEqual(false);
+        });
+    });
+
+    describe('Testing allow-container-className', function () {
+        it('allow-container-className', function () {
+            var radio = $('<input type="radio" class="change-container-classname"/>'),
+                checkbox = $('<input type="checkbox" class="change-container-classname"/>'),
+                radio2 = $('<input type="radio"/>'),
+                checkbox2 = $('<input type="checkbox"/>');
+
+            expect($.validator.methods['allow-container-className']
+                .call($.validator.prototype, radio[0])).toEqual(true);
+            expect($.validator.methods['allow-container-className']
+                .call($.validator.prototype, checkbox[0])).toEqual(true);
+            expect($.validator.methods['allow-container-className']
+                .call($.validator.prototype, radio2[0])).toEqual(false);
+            expect($.validator.methods['allow-container-className']
+                .call($.validator.prototype, checkbox2[0])).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-select', function () {
+        it('validate-select', function () {
+            expect($.validator.methods['validate-select']
+                .call($.validator.prototype, '')).toEqual(false);
+            expect($.validator.methods['validate-select']
+                .call($.validator.prototype, 'none')).toEqual(false);
+            expect($.validator.methods['validate-select']
+                .call($.validator.prototype, null)).toEqual(false);
+            expect($.validator.methods['validate-select']
+                .call($.validator.prototype, undefined)).toEqual(false);
+            expect($.validator.methods['validate-select']
+                .call($.validator.prototype, 'abc')).toEqual(true);
+        });
+    });
+
+    describe('Testing validate-no-empty', function () {
+        it('validate-no-empty', function () {
+            expect($.validator.methods['validate-no-empty']
+                .call($.validator.prototype, '')).toEqual(false);
+            expect($.validator.methods['validate-no-empty']
+                .call($.validator.prototype, null)).toEqual(false);
+            expect($.validator.methods['validate-no-empty']
+                .call($.validator.prototype, undefined)).toEqual(false);
+            expect($.validator.methods['validate-no-empty']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-no-empty']
+                .call($.validator.prototype, 'test')).toEqual(true);
+        });
+    });
+
+    describe('Testing validate-alphanum-with-spaces', function () {
+        it('validate-alphanum-with-spaces', function () {
+            expect($.validator.methods['validate-alphanum-with-spaces']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-alphanum-with-spaces']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-alphanum-with-spaces']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-alphanum-with-spaces']
+                .call($.validator.prototype, '   ')).toEqual(true);
+            expect($.validator.methods['validate-alphanum-with-spaces']
+                .call($.validator.prototype, 'abc   ')).toEqual(true);
+            expect($.validator.methods['validate-alphanum-with-spaces']
+                .call($.validator.prototype, ' 123  ')).toEqual(true);
+            expect($.validator.methods['validate-alphanum-with-spaces']
+                .call($.validator.prototype, '  abc123 ')).toEqual(true);
+            expect($.validator.methods['validate-alphanum-with-spaces']
+                .call($.validator.prototype, '  !@# ')).toEqual(false);
+            expect($.validator.methods['validate-alphanum-with-spaces']
+                .call($.validator.prototype, '  abc.123 ')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-phoneStrict', function () {
+        it('validate-phoneStrict', function () {
+            expect($.validator.methods['validate-phoneStrict']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-phoneStrict']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-phoneStrict']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-phoneStrict']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-phoneStrict']
+                .call($.validator.prototype, '5121231234')).toEqual(false);
+            expect($.validator.methods['validate-phoneStrict']
+                .call($.validator.prototype, '512.123.1234')).toEqual(false);
+            expect($.validator.methods['validate-phoneStrict']
+                .call($.validator.prototype, '512-123-1234')).toEqual(true);
+            expect($.validator.methods['validate-phoneStrict']
+                .call($.validator.prototype, '(512)123-1234')).toEqual(true);
+            expect($.validator.methods['validate-phoneStrict']
+                .call($.validator.prototype, '(512) 123-1234')).toEqual(true);
+        });
+    });
+
+    describe('Testing validate-phoneLax', function () {
+        it('validate-phoneLax', function () {
+            expect($.validator.methods['validate-phoneLax']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-phoneLax']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-phoneLax']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-phoneLax']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-phoneLax']
+                .call($.validator.prototype, '5121231234')).toEqual(true);
+            expect($.validator.methods['validate-phoneLax']
+                .call($.validator.prototype, '512.123.1234')).toEqual(true);
+            expect($.validator.methods['validate-phoneLax']
+                .call($.validator.prototype, '512-123-1234')).toEqual(true);
+            expect($.validator.methods['validate-phoneLax']
+                .call($.validator.prototype, '(512)123-1234')).toEqual(true);
+            expect($.validator.methods['validate-phoneLax']
+                .call($.validator.prototype, '(512) 123-1234')).toEqual(true);
+            expect($.validator.methods['validate-phoneLax']
+                .call($.validator.prototype, '(512)1231234')).toEqual(true);
+            expect($.validator.methods['validate-phoneLax']
+                .call($.validator.prototype, '(512)_123_1234')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-fax', function () {
+        it('validate-fax', function () {
+            expect($.validator.methods['validate-fax']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-fax']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-fax']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-fax']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-fax']
+                .call($.validator.prototype, '5121231234')).toEqual(false);
+            expect($.validator.methods['validate-fax']
+                .call($.validator.prototype, '512.123.1234')).toEqual(false);
+            expect($.validator.methods['validate-fax']
+                .call($.validator.prototype, '512-123-1234')).toEqual(true);
+            expect($.validator.methods['validate-fax']
+                .call($.validator.prototype, '(512)123-1234')).toEqual(true);
+            expect($.validator.methods['validate-fax']
+                .call($.validator.prototype, '(512) 123-1234')).toEqual(true);
+        });
+    });
+
+    describe('Testing validate-email', function () {
+        it('validate-email', function () {
+            expect($.validator.methods['validate-email']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-email']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-email']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-email']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-email']
+                .call($.validator.prototype, '123@123.com')).toEqual(true);
+            expect($.validator.methods['validate-email']
+                .call($.validator.prototype, 'abc@124.en')).toEqual(true);
+            expect($.validator.methods['validate-email']
+                .call($.validator.prototype, 'abc@abc.commmmm')).toEqual(true);
+            expect($.validator.methods['validate-email']
+                .call($.validator.prototype, 'abc.abc.abc@abc.commmmm')).toEqual(true);
+            expect($.validator.methods['validate-email']
+                .call($.validator.prototype, 'abc.abc-abc@abc.commmmm')).toEqual(true);
+            expect($.validator.methods['validate-email']
+                .call($.validator.prototype, 'abc.abc_abc@abc.commmmm')).toEqual(true);
+            expect($.validator.methods['validate-email']
+                .call($.validator.prototype, 'abc.abc_abc@abc')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-emailSender', function () {
+        it('validate-emailSender', function () {
+            expect($.validator.methods['validate-emailSender']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-emailSender']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-emailSender']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-emailSender']
+                .call($.validator.prototype, '   ')).toEqual(true);
+            expect($.validator.methods['validate-emailSender']
+                .call($.validator.prototype, '123@123.com')).toEqual(true);
+            expect($.validator.methods['validate-emailSender']
+                .call($.validator.prototype, 'abc@124.en')).toEqual(true);
+            expect($.validator.methods['validate-emailSender']
+                .call($.validator.prototype, 'abc@abc.commmmm')).toEqual(true);
+            expect($.validator.methods['validate-emailSender']
+                .call($.validator.prototype, 'abc.abc.abc@abc.commmmm')).toEqual(true);
+            expect($.validator.methods['validate-emailSender']
+                .call($.validator.prototype, 'abc.abc-abc@abc.commmmm')).toEqual(true);
+            expect($.validator.methods['validate-emailSender']
+                .call($.validator.prototype, 'abc.abc_abc@abc.commmmm')).toEqual(true);
+        });
+    });
+
+    describe('Testing validate-password', function () {
+        it('validate-password', function () {
+            expect($.validator.methods['validate-password']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-password']
+                .call($.validator.prototype, null)).toEqual(false);
+            expect($.validator.methods['validate-password']
+                .call($.validator.prototype, undefined)).toEqual(false);
+            expect($.validator.methods['validate-password']
+                .call($.validator.prototype, '   ')).toEqual(true);
+            expect($.validator.methods['validate-password']
+                .call($.validator.prototype, '123@123.com')).toEqual(true);
+            expect($.validator.methods['validate-password']
+                .call($.validator.prototype, 'abc')).toEqual(false);
+            expect($.validator.methods['validate-password']
+                .call($.validator.prototype, 'abc       ')).toEqual(false);
+            expect($.validator.methods['validate-password']
+                .call($.validator.prototype, '     abc      ')).toEqual(false);
+            expect($.validator.methods['validate-password']
+                .call($.validator.prototype, 'dddd')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-admin-password', function () {
+        it('validate-admin-password', function () {
+            expect($.validator.methods['validate-admin-password']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-admin-password']
+                .call($.validator.prototype, null)).toEqual(false);
+            expect($.validator.methods['validate-admin-password']
+                .call($.validator.prototype, undefined)).toEqual(false);
+            expect($.validator.methods['validate-admin-password']
+                .call($.validator.prototype, '   ')).toEqual(true);
+            expect($.validator.methods['validate-admin-password']
+                .call($.validator.prototype, '123@123.com')).toEqual(true);
+            expect($.validator.methods['validate-admin-password']
+                .call($.validator.prototype, 'abc')).toEqual(false);
+            expect($.validator.methods['validate-admin-password']
+                .call($.validator.prototype, 'abc       ')).toEqual(false);
+            expect($.validator.methods['validate-admin-password']
+                .call($.validator.prototype, '     abc      ')).toEqual(false);
+            expect($.validator.methods['validate-admin-password']
+                .call($.validator.prototype, 'dddd')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-url', function () {
+        it('validate-url', function () {
+            expect($.validator.methods['validate-url']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-url']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-url']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-url']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-url']
+                .call($.validator.prototype, 'http://www.google.com')).toEqual(true);
+            expect($.validator.methods['validate-url']
+                .call($.validator.prototype, 'http://127.0.0.1:8080/index.php')).toEqual(true);
+            expect($.validator.methods['validate-url']
+                .call($.validator.prototype, 'http://app-spot.com/index.php')).toEqual(true);
+            expect($.validator.methods['validate-url']
+                .call($.validator.prototype, 'http://app-spot_space.com/index.php')).toEqual(true);
+        });
+    });
+
+    describe('Testing validate-clean-url', function () {
+        it('validate-clean-url', function () {
+            expect($.validator.methods['validate-clean-url']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-clean-url']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-clean-url']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-clean-url']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-clean-url']
+                .call($.validator.prototype, 'http://www.google.com')).toEqual(true);
+            expect($.validator.methods['validate-clean-url']
+                .call($.validator.prototype, 'http://127.0.0.1:8080/index.php')).toEqual(false);
+            expect($.validator.methods['validate-clean-url']
+                .call($.validator.prototype, 'http://127.0.0.1:8080')).toEqual(false);
+            expect($.validator.methods['validate-clean-url']
+                .call($.validator.prototype, 'http://127.0.0.1')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-xml-identifier', function () {
+        it('validate-xml-identifier', function () {
+            expect($.validator.methods['validate-xml-identifier']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-xml-identifier']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-xml-identifier']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-xml-identifier']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-xml-identifier']
+                .call($.validator.prototype, 'abc')).toEqual(true);
+            expect($.validator.methods['validate-xml-identifier']
+                .call($.validator.prototype, 'abc_123')).toEqual(true);
+            expect($.validator.methods['validate-xml-identifier']
+                .call($.validator.prototype, 'abc-123')).toEqual(true);
+            expect($.validator.methods['validate-xml-identifier']
+                .call($.validator.prototype, '123-abc')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-ssn', function () {
+        it('validate-ssn', function () {
+            expect($.validator.methods['validate-ssn']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-ssn']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-ssn']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-ssn']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-ssn']
+                .call($.validator.prototype, 'abc')).toEqual(false);
+            expect($.validator.methods['validate-ssn']
+                .call($.validator.prototype, '123-13-1234')).toEqual(true);
+            expect($.validator.methods['validate-ssn']
+                .call($.validator.prototype, '012-12-1234')).toEqual(true);
+            expect($.validator.methods['validate-ssn']
+                .call($.validator.prototype, '23-12-1234')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-zip-us', function () {
+        it('validate-zip-us', function () {
+            expect($.validator.methods['validate-zip-us']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-zip-us']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-zip-us']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-zip-us']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-zip-us']
+                .call($.validator.prototype, '12345-1234')).toEqual(true);
+            expect($.validator.methods['validate-zip-us']
+                .call($.validator.prototype, '02345')).toEqual(true);
+            expect($.validator.methods['validate-zip-us']
+                .call($.validator.prototype, '1234')).toEqual(false);
+            expect($.validator.methods['validate-zip-us']
+                .call($.validator.prototype, '1234-1234')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-date-au', function () {
+        it('validate-date-au', function () {
+            expect($.validator.methods['validate-date-au']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-date-au']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-date-au']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-date-au']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-date-au']
+                .call($.validator.prototype, '01/01/2012')).toEqual(true);
+            expect($.validator.methods['validate-date-au']
+                .call($.validator.prototype, '30/01/2012')).toEqual(true);
+            expect($.validator.methods['validate-date-au']
+                .call($.validator.prototype, '01/30/2012')).toEqual(false);
+            expect($.validator.methods['validate-date-au']
+                .call($.validator.prototype, '1/1/2012')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-currency-dollar', function () {
+        it('validate-currency-dollar', function () {
+            expect($.validator.methods['validate-currency-dollar']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-currency-dollar']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-currency-dollar']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-currency-dollar']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-currency-dollar']
+                .call($.validator.prototype, '$123')).toEqual(true);
+            expect($.validator.methods['validate-currency-dollar']
+                .call($.validator.prototype, '$1,123.00')).toEqual(true);
+            expect($.validator.methods['validate-currency-dollar']
+                .call($.validator.prototype, '$1234')).toEqual(true);
+            expect($.validator.methods['validate-currency-dollar']
+                .call($.validator.prototype, '$1234.1234')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-not-negative-number', function () {
+        it('validate-not-negative-number', function () {
+            expect($.validator.methods['validate-not-negative-number']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-not-negative-number']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-not-negative-number']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-not-negative-number']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-not-negative-number']
+                .call($.validator.prototype, '0')).toEqual(true);
+            expect($.validator.methods['validate-not-negative-number']
+                .call($.validator.prototype, '1')).toEqual(true);
+            expect($.validator.methods['validate-not-negative-number']
+                .call($.validator.prototype, '1234')).toEqual(true);
+            expect($.validator.methods['validate-not-negative-number']
+                .call($.validator.prototype, '1,234.1234')).toEqual(true);
+            expect($.validator.methods['validate-not-negative-number']
+                .call($.validator.prototype, '-1')).toEqual(false);
+            expect($.validator.methods['validate-not-negative-number']
+                .call($.validator.prototype, '-1e')).toEqual(false);
+            expect($.validator.methods['validate-not-negative-number']
+                .call($.validator.prototype, '-1,234.1234')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-greater-than-zero', function () {
+        it('validate-greater-than-zero', function () {
+            expect($.validator.methods['validate-greater-than-zero']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-greater-than-zero']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-greater-than-zero']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-greater-than-zero']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-greater-than-zero']
+                .call($.validator.prototype, '0')).toEqual(false);
+            expect($.validator.methods['validate-greater-than-zero']
+                .call($.validator.prototype, '1')).toEqual(true);
+            expect($.validator.methods['validate-greater-than-zero']
+                .call($.validator.prototype, '1234')).toEqual(true);
+            expect($.validator.methods['validate-greater-than-zero']
+                .call($.validator.prototype, '1,234.1234')).toEqual(true);
+            expect($.validator.methods['validate-greater-than-zero']
+                .call($.validator.prototype, '-1')).toEqual(false);
+            expect($.validator.methods['validate-greater-than-zero']
+                .call($.validator.prototype, '-1e')).toEqual(false);
+            expect($.validator.methods['validate-greater-than-zero']
+                .call($.validator.prototype, '-1,234.1234')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-css-length', function () {
+        it('validate-css-length', function () {
+            expect($.validator.methods['validate-css-length']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-css-length']
+                .call($.validator.prototype, null)).toEqual(false);
+            expect($.validator.methods['validate-css-length']
+                .call($.validator.prototype, undefined)).toEqual(false);
+            expect($.validator.methods['validate-css-length']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-css-length']
+                .call($.validator.prototype, '0')).toEqual(true);
+            expect($.validator.methods['validate-css-length']
+                .call($.validator.prototype, '1')).toEqual(true);
+            expect($.validator.methods['validate-css-length']
+                .call($.validator.prototype, '1234')).toEqual(true);
+            expect($.validator.methods['validate-css-length']
+                .call($.validator.prototype, '1,234.1234')).toEqual(false);
+            expect($.validator.methods['validate-css-length']
+                .call($.validator.prototype, '-1')).toEqual(false);
+            expect($.validator.methods['validate-css-length']
+                .call($.validator.prototype, '-1e')).toEqual(false);
+            expect($.validator.methods['validate-css-length']
+                .call($.validator.prototype, '-1,234.1234')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-data', function () {
+        it('validate-data', function () {
+            expect($.validator.methods['validate-data']
+                .call($.validator.prototype, '')).toEqual(true);
+            expect($.validator.methods['validate-data']
+                .call($.validator.prototype, null)).toEqual(true);
+            expect($.validator.methods['validate-data']
+                .call($.validator.prototype, undefined)).toEqual(true);
+            expect($.validator.methods['validate-data']
+                .call($.validator.prototype, '   ')).toEqual(false);
+            expect($.validator.methods['validate-data']
+                .call($.validator.prototype, '123abc')).toEqual(false);
+            expect($.validator.methods['validate-data']
+                .call($.validator.prototype, 'abc')).toEqual(true);
+            expect($.validator.methods['validate-data']
+                .call($.validator.prototype, ' abc')).toEqual(false);
+            expect($.validator.methods['validate-data']
+                .call($.validator.prototype, 'abc123')).toEqual(true);
+            expect($.validator.methods['validate-data']
+                .call($.validator.prototype, 'abc-123')).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-one-required-by-name', function () {
+        it('validate-one-required-by-name', function () {
+            var radio = $('<input type="radio" name="radio"/>'),
+                radio2 = $('<input type="radio" name="radio" checked/>'),
+                checkbox = $('<input type="checkbox" name="checkbox"/>'),
+                checkbox2 = $('<input type="checkbox" name="checkbox" checked/>'),
+                $test = $('<div id="test-block" />'),
+                prevForm = $.validator.prototype.currentForm;
+
+            $.validator.prototype.currentForm = $test[0];
+
+            $test.append(radio);
+            expect($.validator.methods['validate-one-required-by-name']
+                .call($.validator.prototype, null, radio[0], true)).toEqual(false);
+            $test.append(radio2);
+            expect($.validator.methods['validate-one-required-by-name']
+                .call($.validator.prototype, null, radio2[0], true)).toEqual(true);
+            $test.append(checkbox);
+            expect($.validator.methods['validate-one-required-by-name']
+                .call($.validator.prototype, null, checkbox[0], true)).toEqual(false);
+            $test.append(checkbox2);
+            expect($.validator.methods['validate-one-required-by-name']
+                .call($.validator.prototype, null, checkbox2[0], true)).toEqual(true);
+
+            $.validator.prototype.currentForm = prevForm;
+        });
+    });
+
+    describe('Testing less-than-equals-to', function () {
+        it('less-than-equals-to', function () {
+            var elm1 =  $('<input type="text" value="6" id="element1" />'),
+                elm2 =  $('<input type="text" value="5" id="element2" />'),
+                elm3 =  $('<input type="text" id="element3" />'),
+                elm4 =  $('<input type="text" value=5 id="element4" />'),
+                elm5 =  $('<input type="text" id="element6" />'),
+                elm6 =  $('<input type="text" value=6 id="element5" />'),
+                elm7 =  $('<input type="text" value=20 id="element7" />'),
+                elm8 =  $('<input type="text" value=100 id="element8" />');
+
+            expect($.validator.methods['less-than-equals-to']
+                .call($.validator.prototype, elm1[0].value, elm1, elm2)).toEqual(false);
+            elm1[0].value = 4;
+            expect($.validator.methods['less-than-equals-to']
+                .call($.validator.prototype, elm1[0].value, elm1, elm2)).toEqual(true);
+            expect($.validator.methods['less-than-equals-to']
+                .call($.validator.prototype, elm3[0].value, elm3, elm4)).toEqual(true);
+            expect($.validator.methods['less-than-equals-to']
+                .call($.validator.prototype, elm5[0].value, elm5, elm6)).toEqual(true);
+            expect($.validator.methods['less-than-equals-to']
+                .call($.validator.prototype, elm7[0].value, elm7, elm8)).toEqual(true);
+        });
+    });
+
+    describe('Testing greater-than-equals-to', function () {
+        it('greater-than-equals-to', function () {
+            var elm1 =  $('<input type="text" value=6 id="element1" />'),
+                elm2 =  $('<input type="text" value=7 id="element2" />'),
+                elm3 =  $('<input type="text" id="element3" />'),
+                elm4 =  $('<input type="text" value=5 id="element4" />'),
+                elm5 =  $('<input type="text" id="element6" />'),
+                elm6 =  $('<input type="text" value=6 id="element5" />'),
+                elm7 =  $('<input type="text" value=100 id="element7" />'),
+                elm8 =  $('<input type="text" value=20 id="element8" />');
+
+            expect($.validator.methods['greater-than-equals-to']
+                .call($.validator.prototype, elm1[0].value, elm1, elm2)).toEqual(false);
+            elm1[0].value = 9;
+            expect($.validator.methods['greater-than-equals-to']
+                .call($.validator.prototype, elm1[0].value, elm1, elm2)).toEqual(true);
+            expect($.validator.methods['greater-than-equals-to']
+                .call($.validator.prototype, elm3[0].value, elm3, elm4)).toEqual(true);
+            expect($.validator.methods['greater-than-equals-to']
+                .call($.validator.prototype, elm5[0].value, elm5, elm6)).toEqual(true);
+            expect($.validator.methods['greater-than-equals-to']
+                .call($.validator.prototype, elm7[0].value, elm7, elm8)).toEqual(true);
+        });
+    });
+
+    describe('Testing validate-cc-type-select', function () {
+        it('validate-cc-type-select', function () {
+            var visaValid = $('<input id="visa-valid" type="text" value="4916808263499650"/>'),
+                visaInvalid = $('<input id="visa-invalid" type="text" value="1234567890123456"/>'),
+                mcValid = $('<input id="mc-valid" type="text" value="5203731841177490"/>'),
+                mcInvalid = $('<input id="mc-invalid" type="text" value="1111222233334444"/>'),
+                aeValid = $('<input id="ae-valid" type="text" value="376244899619217"/>'),
+                aeInvalid = $('<input id="ae-invalid" type="text" value="123451234512345"/>'),
+                diValid = $('<input id="di-valid" type="text" value="6011050000000009"/>'),
+                diInvalid = $('<input id="di-invalid" type="text" value="6011199900000005"/>'),
+                dnValid = $('<input id="dn-valid" type="text" value="3095434000000001"/>'),
+                dnInvalid = $('<input id="dn-invalid" type="text" value="3799999900000003"/>'),
+                jcbValid = $('<input id="jcb-valid" type="text" value="3528000000000007"/>'),
+                jcbInvalid = $('<input id="jcb-invalid" type="text" value="359000001111118"/>');
+
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'VI', null, visaValid)).toEqual(true);
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'VI', null, visaInvalid)).toEqual(false);
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'MC', null, mcValid)).toEqual(true);
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'MC', null, mcInvalid)).toEqual(false);
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'AE', null, aeValid)).toEqual(true);
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'AE', null, aeInvalid)).toEqual(false);
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'DI', null, diValid)).toEqual(true);
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'DI', null, diInvalid)).toEqual(false);
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'DN', null, dnValid)).toEqual(true);
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'DN', null, dnInvalid)).toEqual(false);
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'JCB', null, jcbValid)).toEqual(true);
+            expect($.validator.methods['validate-cc-type-select']
+                .call($.validator.prototype, 'JCB', null, jcbInvalid)).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-cc-number', function () {
+        it('validate-cc-number', function () {
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '4916835098995909', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '5265071363284878', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6011120623356953', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '371293266574617', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '4916835098995901', null, null)).toEqual(false);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '5265071363284870', null, null)).toEqual(false);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6011120623356951', null, null)).toEqual(false);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '371293266574619', null, null)).toEqual(false);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '2221220000000003', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '2721220000000008', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '601109020000000003', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6011111144444444', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6011222233334444', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6011522233334447', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '601174455555553', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6011745555555550', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '601177455555556', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '601182455555556', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '601187999555558', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '601287999555556', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6444444444444443', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6644444444444441', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '3044444444444444', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '3064444444444449', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '3095444444444442', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '3096444444444441', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '3696444444444445', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '3796444444444444', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '3896444444444443', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '3528444444444449', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '3529444444444448', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6221262244444440', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6229981111111111', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6249981111111117', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6279981111111110', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6282981111111115', null, null)).toEqual(true);
+            expect($.validator.methods['validate-cc-number']
+                .call($.validator.prototype, '6289981111111118', null, null)).toEqual(true);
+        });
+    });
+
+    describe('Testing validate-cc-type', function () {
+        it('validate-cc-type', function () {
+            var select = $('<select id="cc-type">' +
+                '<option value="">' +
+                '</option><option value="VI">' +
+                '</option><option value="MC">' +
+                '</option><option value="AE">' +
+                '</option><option value="DI">' +
+                '</option><option value="DN">' +
+                '</option><option value="JCB">' +
+                '</option><option value="UP">' +
+                '</option>' +
+                '</select>');
+
+            select.val('VI');
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '4916835098995909', null, select)).toEqual(true);
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '5265071363284878', null, select)).toEqual(false);
+
+            select.val('MC');
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '5265071363284878', null, select)).toEqual(true);
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '4916835098995909', null, select)).toEqual(false);
+
+            select.val('AE');
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '371293266574617', null, select)).toEqual(true);
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '5265071363284878', null, select)).toEqual(false);
+
+            select.val('DI');
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '6011050000000009', null, select)).toEqual(true);
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '371293266574617', null, select)).toEqual(false);
+
+            select.val('DN');
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '3095434000000001', null, select)).toEqual(true);
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '6011050000000009', null, select)).toEqual(false);
+
+            select.val('JCB');
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '3528000000000007', null, select)).toEqual(true);
+            expect($.validator.methods['validate-cc-type']
+                .call($.validator.prototype, '3095434000000001', null, select)).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-cc-exp', function () {
+        it('validate-cc-exp', function () {
+            var year = $('<input id="year" type="text" value="4916808263499650"/>'),
+                currentTime  = new Date(),
+                currentMonth = currentTime.getMonth() + 1,
+                currentYear  = currentTime.getFullYear();
+
+            year.val(currentYear);
+
+            if (currentMonth > 1) {
+                expect($.validator.methods['validate-cc-exp']
+                    .call($.validator.prototype, currentMonth - 1, null, year)).toEqual(false);
+            }
+            expect($.validator.methods['validate-cc-exp']
+                .call($.validator.prototype, currentMonth, null, year)).toEqual(true);
+            year.val(currentYear + 1);
+            expect($.validator.methods['validate-cc-exp']
+                .call($.validator.prototype, currentMonth, null, year)).toEqual(true);
+        });
+    });
+
+    describe('Testing validate-cc-cvn', function () {
+        it('validate-cc-cvn', function () {
+            var ccType = $('<select id="cc-type">' +
+                '<option value=""></option>' +
+                '<option value="VI"></option>' +
+                '<option value="MC"></option>' +
+                '<option value="AE"></option>' +
+                '<option value="DI"></option>' +
+                '</select>');
+
+            ccType.val('VI');
+            expect($.validator.methods['validate-cc-cvn']
+                .call($.validator.prototype, '123', null, ccType)).toEqual(true);
+            expect($.validator.methods['validate-cc-cvn']
+                .call($.validator.prototype, '1234', null, ccType)).toEqual(false);
+
+            ccType.val('MC');
+            expect($.validator.methods['validate-cc-cvn']
+                .call($.validator.prototype, '123', null, ccType)).toEqual(true);
+            expect($.validator.methods['validate-cc-cvn']
+                .call($.validator.prototype, '1234', null, ccType)).toEqual(false);
+
+            ccType.val('AE');
+            expect($.validator.methods['validate-cc-cvn']
+                .call($.validator.prototype, '1234', null, ccType)).toEqual(true);
+            expect($.validator.methods['validate-cc-cvn']
+                .call($.validator.prototype, '123', null, ccType)).toEqual(false);
+
+            ccType.val('DI');
+            expect($.validator.methods['validate-cc-cvn']
+                .call($.validator.prototype, '123', null, ccType)).toEqual(true);
+            expect($.validator.methods['validate-cc-cvn']
+                .call($.validator.prototype, '1234', null, ccType)).toEqual(false);
+        });
+    });
+
+    describe('Testing validate-number-range', function () {
+        it('validate-number-range', function () {
+            var el1 = $('<input type="text" value="" ' +
+                'class="validate-number-range number-range-10-20 number-range-10-100.20">').get(0);
+
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '-1', null, null)).toEqual(true);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '1', null, null)).toEqual(true);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '', null, null)).toEqual(true);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, null, null, null)).toEqual(true);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '0', null, null)).toEqual(true);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, 'asds', null, null)).toEqual(false);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '10', null, '10-20.06')).toEqual(true);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '15', null, '10-20.06')).toEqual(true);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '1', null, '10-20.06')).toEqual(false);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '30', null, '10-20.06')).toEqual(false);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '10', el1, null)).toEqual(true);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '15', el1, null)).toEqual(true);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '1', el1, null)).toEqual(false);
+            expect($.validator.methods['validate-number-range']
+                .call($.validator.prototype, '30', el1, null)).toEqual(true);
+        });
+    });
+
+    describe('Testing validate-digits-range', function () {
+        it('validate-digits-range', function () {
+            var el1 = $('<input type="text" value="" ' +
+                'class="validate-digits-range digits-range-10-20 digits-range-10-100.20">').get(0);
+
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '-1', null, null)).toEqual(true);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '1', null, null)).toEqual(true);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '', null, null)).toEqual(true);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, null, null, null)).toEqual(true);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '0', null, null)).toEqual(true);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, 'asds', null, null)).toEqual(false);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '10', null, '10-20')).toEqual(true);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '15', null, '10-20')).toEqual(true);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '1', null, '10-20')).toEqual(false);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '30', null, '10-20')).toEqual(false);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '30', null, '10-20.06')).toEqual(false);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '10', el1, null)).toEqual(true);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '15', el1, null)).toEqual(true);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '1', el1, null)).toEqual(false);
+            expect($.validator.methods['validate-digits-range']
+                .call($.validator.prototype, '30', el1, null)).toEqual(false);
+        });
+    });
 });
diff --git a/lib/web/jquery/jstree/jquery.jstree.js b/lib/web/jquery/jstree/jquery.jstree.js
index e2f6330ba45eb0ea6d74ed49a065d6745dac3c6c..4671256b4207bc09e4c9e5d993cd59109145ac4e 100644
--- a/lib/web/jquery/jstree/jquery.jstree.js
+++ b/lib/web/jquery/jstree/jquery.jstree.js
@@ -28,7 +28,7 @@
 "use strict";
 
 // top wrapper to prevent multiple inclusion (is this OK?)
-(function () { if(jQuery && jQuery.jstree) { return; }
+(function () {
 	var is_ie6 = false, is_ie7 = false, is_ff2 = false;
 
 /*
diff --git a/lib/web/mage/collapsible.js b/lib/web/mage/collapsible.js
index 0d8cf836c198e1019203913f4efbdc0e67f5763c..267734605f141a0e13d5b8106b9cd02fff9ce236 100644
--- a/lib/web/mage/collapsible.js
+++ b/lib/web/mage/collapsible.js
@@ -243,7 +243,7 @@ define([
                 });
 
             // For collapsible widget only (not tabs or accordion)
-            if (this.header.parent().attr('role') != 'presentation') { //eslint-disable-line eqeqeq
+            if (this.header.parent().attr('role') !== 'presentation') {
                 this.header
                     .parent()
                     .attr('role', 'tablist');
@@ -316,9 +316,9 @@ define([
          * Disable.
          */
         disable: function () {
+            this.options.disabled = true;
             this._off(this.trigger);
             this.forceDeactivate();
-            this.options.disabled = true;
 
             if (this.options.disabledState) {
                 this.element.addClass(this.options.disabledState);
@@ -330,12 +330,14 @@ define([
          * Enable.
          */
         enable: function () {
-            this._on(this.trigger, this.events);
             this.options.disabled = false;
+            this._on(this.trigger, this.events);
+            this.forceActivate();
 
             if (this.options.disabledState) {
                 this.element.removeClass(this.options.disabledState);
             }
+            this.trigger.attr('tabIndex', 0);
         },
 
         /**
@@ -517,7 +519,7 @@ define([
                 that = this;
 
             if (url) {
-                this.xhr = $.get({
+                that.xhr = $.get({
                     url: url,
                     dataType: 'html'
                 }, function () {
@@ -533,7 +535,8 @@ define([
                     setTimeout(function () {
                         that.content.html(response);
                     }, 1);
-                }).complete(function (jqXHR, status) {
+                });
+                that.xhr.complete(function (jqXHR, status) {
                     setTimeout(function () {
                         if (status === 'abort') {
                             that.content.stop(false, true);
diff --git a/lib/web/mage/validation.js b/lib/web/mage/validation.js
index 2b5aaff8385025d2caf3a5fa505034feee5ca6c5..ac99b04ad1b7a3f4d82d1dc0a4b41ea3780c5a85 100644
--- a/lib/web/mage/validation.js
+++ b/lib/web/mage/validation.js
@@ -845,11 +845,13 @@
                 result = true;
                 range = param;
 
-                if (typeof range === 'object') {
+                if (typeof range === 'string') {
                     m = dataAttrRange.exec(range);
 
                     if (m) {
                         result = result && $.mage.isBetween(numValue, m[1], m[2]);
+                    } else {
+                        result = false;
                     }
                 } else if (elm && elm.className) {
                     classes = elm.className.split(' ');
@@ -896,11 +898,13 @@
                 result = true;
                 range = param;
 
-                if (typeof range === 'object') {
+                if (typeof range === 'string') {
                     m = dataAttrRange.exec(range);
 
                     if (m) {
                         result = result && $.mage.isBetween(numValue, m[1], m[2]);
+                    } else {
+                        result = false;
                     }
                 } else if (elm && elm.className) {
                     classes = elm.className.split(' ');