Index: src/main/resources/data.sql
===================================================================
--- src/main/resources/data.sql	(revision a436340967abb97f2cda58184c9eaaa6f91fcea1)
+++ src/main/resources/data.sql	(revision 2b0a4db95e071b47a10460f6bb4d73d43885fb9c)
@@ -7,7 +7,7 @@
 insert into business_type (id, created, modified, name)
 values (1, current_timestamp, current_timestamp, 'tailor'),
-       (2, current_timestamp, current_timestamp, 'nail salon'),
-       (3, current_timestamp, current_timestamp, 'massage parlor'),
-       (4, current_timestamp, current_timestamp, 'makeup studio'),
+       (2, current_timestamp, current_timestamp, 'nail technician'),
+       (3, current_timestamp, current_timestamp, 'masseuse'),
+       (4, current_timestamp, current_timestamp, 'makeup artist'),
        (5, current_timestamp, current_timestamp, 'hairdresser'),
        (6, current_timestamp, current_timestamp, 'barber');
Index: c/main/resources/static/js/bootstrap-autocomplete.min.js
===================================================================
--- src/main/resources/static/js/bootstrap-autocomplete.min.js	(revision a436340967abb97f2cda58184c9eaaa6f91fcea1)
+++ 	(revision )
@@ -1,7 +1,0 @@
-/*!
-  * Bootstrap Autocomplete v0.2.0 (https://iqbalfn.github.io/bootstrap-autocomplete/)
-  * Copyright 2019 Iqbal Fauzi
-  * Licensed under MIT (https://github.com/iqbalfn/bootstrap-autocomplete/blob/master/LICENSE)
-  */
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("jquery")):"function"==typeof define&&define.amd?define(["exports","jquery"],t):t((e=e||self)["bootstrap-autocomplete"]={},e.jQuery)}(this,function(e,s){"use strict";function i(e,t){for(var n=0;n<t.length;n++){var i=t[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(e,i.key,i)}}function o(i){for(var e=1;e<arguments.length;e++){var r=null!=arguments[e]?Object(arguments[e]):{},t=Object.keys(r);"function"==typeof Object.getOwnPropertySymbols&&(t=t.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),t.forEach(function(e){var t,n;t=i,e=r[n=e],n in t?Object.defineProperty(t,n,{value:e,enumerable:!0,configurable:!0,writable:!0}):t[n]=e})}return i}s=s&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s;var t="transitionend";function n(e){var t=this,n=!1;return s(this).one(l.TRANSITION_END,function(){n=!0}),setTimeout(function(){n||l.triggerTransitionEnd(t)},e),this}var l={TRANSITION_END:"bsTransitionEnd",getUID:function(e){for(;e+=~~(1e6*Math.random()),document.getElementById(e););return e},getSelectorFromElement:function(e){var t=e.getAttribute("data-target");t&&"#"!==t||(t=(e=e.getAttribute("href"))&&"#"!==e?e.trim():"");try{return document.querySelector(t)?t:null}catch(e){return null}},getTransitionDurationFromElement:function(e){if(!e)return 0;var t=s(e).css("transition-duration"),n=s(e).css("transition-delay"),i=parseFloat(t),e=parseFloat(n);return i||e?(t=t.split(",")[0],n=n.split(",")[0],1e3*(parseFloat(t)+parseFloat(n))):0},reflow:function(e){return e.offsetHeight},triggerTransitionEnd:function(e){s(e).trigger(t)},supportsTransitionEnd:function(){return Boolean(t)},isElement:function(e){return(e[0]||e).nodeType},typeCheckConfig:function(e,t,n){for(var i in n)if(Object.prototype.hasOwnProperty.call(n,i)){var r=n[i],o=t[i],s=o&&l.isElement(o)?"element":(s=o,{}.toString.call(s).match(/\s([a-z]+)/i)[1].toLowerCase());if(!new RegExp(r).test(s))throw new Error(e.toUpperCase()+': Option "'+i+'" provided type "'+s+'" but expected type "'+r+'".')}var s},findShadowRoot:function(e){if(!document.documentElement.attachShadow)return null;if("function"!=typeof e.getRootNode)return e instanceof ShadowRoot?e:e.parentNode?l.findShadowRoot(e.parentNode):null;e=e.getRootNode();return e instanceof ShadowRoot?e:null}};s.fn.emulateTransitionEnd=n,s.event.special[l.TRANSITION_END]={bindType:t,delegateType:t,handle:function(e){if(s(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}};var a="autocomplete",u="bs.autocomplete",c="."+u,r=".data-api",h=s.fn[a],f={list:null,prefetch:null,filter:null,filterDelay:300,filterMinChars:1,filterRelation:null,maxResult:10,onPick:null,onItemRendered:null,preProcess:null},_={list:"(null|string|element)",prefetch:"(null|string)",filter:"(null|string)",filterDelay:"number",filterMinChars:"number",filterRelation:"(null|object)",maxResult:"number",preProcess:"(null|function)",onPick:"(null|function)",onItemRendered:"(null|function)"},d={BLUR_DATA_API:"blur"+c+r,CLICK_DATA_API:"click"+c+r,KEYDOWN_DATA_API:"keydown"+c+r,INPUT_DATA_API:"input"+c+r,PICK:"pick"+c,ITEM_RENDER:"itemrender"+c},p=40,m=38,g=13,v=27,w=function(){function r(e,t){if(this._config=this._getConfig(t),this._element=e,this._items=[],this._labels={},this._isShown=!1,this._dropdown=null,this._spinner=null,this._result=[],this._query="",this._preventClose=!1,this._timer=null,this._relations=null,e.hasAttribute("list")&&(this._config.list="#"+e.getAttribute("list"),e.removeAttribute("list")),!this._config.list&&!this._config.prefetch&&!this._config.filter)throw new TypeError("No data source provided");this._config.filterRelation&&this._handleRelations(),e.setAttribute("autocomplete","off"),this._makeDropdown(),this._makeSpinner(),this._fetchPresetData(),this._addElementListener()}var e,t,n=r.prototype;return n.show=function(){this._isShown||this._result.length&&this._showDropdown()},n.hide=function(){this._isShown&&this._hideDropdown()},n.dispose=function(){s(this._element).off(c),s.removeData(this._element,u),this._config=null,this._element=null,this._items=null,this._labels=null,this._isShown=null,this._dropdown=null,this._spinner=null,this._result=null,this._query=null,this._preventClose=null,this._timer&&clearTimeout(this._timer),this._timer=null},n._addElementListener=function(){var i=this;s(this._element).on(d.KEYDOWN_DATA_API,function(e){var t,n=!1;switch(e.keyCode){case p:e.altKey&&!i._isShown?(i._query=i._element.value.trim().toLowerCase(),i._query&&(i._findFromList(),n=!0)):(i._focusNext(),n=!0);break;case m:i._focusPrev(),n=!0;break;case g:i._isShown&&((t=(t=s(i._dropdown).children(".active").get(0))||s(i._dropdown).children(":first-child").get(0))&&i._selectItem(t),i.hide(),n=!0);break;case v:n=!0,i.hide()}n&&e.preventDefault()}),s(this._element).on(d.INPUT_DATA_API,function(e){i._query=i._element.value.trim().toLowerCase(),i._query?i._findFromList():(i._truncateDropdown(),i.hide())}),s(this._element).on(d.BLUR_DATA_API,function(e){i._preventClose||setTimeout(function(){return i.hide()},150)})},n._fetchPresetData=function(){var e,n=this;this._config.list&&("string"==typeof(e=this._config.list)&&(e=document.querySelector(this._config.list)),e&&Array.from(e.children).forEach(function(e){var t=e.innerHTML.toLowerCase();n._items.includes(t)||(n._items.push(t),n._labels[t]=e.innerHTML)})),this._config.prefetch&&(this._showSpinner(),s.get(this._config.prefetch,function(e){n._hideSpinner(),n._config.preProcess&&(e=n._config.preProcess(e)),e.forEach(function(e){var t=e.toLowerCase();n._items.includes(t)||(n._items.push(t),n._labels[t]=e)})}))},n._findFromAjax=function(){var r,o=this;this._config.filter&&(this._dropdown.children.length>=this._config.maxResult||(this._timer&&clearTimeout(this._timer),r=this._query,this._timer=setTimeout(function(){if(r==o._query){o._showSpinner();var e=o._config.filter.replace(/%23/g,"#").replace("#QUERY#",o._query);if(o._relations){var t,n=e.includes("?")?"&":"?";for(t in o._relations){var i=o._relations[t],i=s(i).val();i&&(e+=""+n+t+"="+i,n="&")}}s.get(e,function(e){o._hideSpinner(),o._config.preProcess&&(e=o._config.preProcess(e));var n=[];e.forEach(function(e){var t=e.toLowerCase();o._items.includes(t)||(o._items.push(t),o._labels[t]=e,n.push(e),o._result.push(e))}),n.length&&o._renderItem(n),o._result.length?o.show():o.hide()})}},this._config.filterDelay)))},n._findFromList=function(){var t=this;this._truncateDropdown(),this._result=[];var n=[];this._items.forEach(function(e){e.includes(t._query)&&(e=t._labels[e],t._result.includes(e)||(n.push(e),t._result.push(e)))}),n.length?(this._renderItem(n),this.show()):this.hide(),this._findFromAjax()},n._focusNext=function(){var e=s(this._dropdown).children(":first-child").get(0),t=s(this._dropdown).children(".active").get(0);t&&(t.classList.remove("active"),(t=s(t).next().get(0))&&(e=t)),e&&e.classList.add("active")},n._focusPrev=function(){var e=s(this._dropdown).children(":last-child").get(0),t=s(this._dropdown).children(".active").get(0);t&&(t.classList.remove("active"),(t=s(t).prev().get(0))&&(e=t)),e&&e.classList.add("active")},n._getConfig=function(e){return e=o({},f,e),l.typeCheckConfig(a,e,_),e},n._handleRelations=function(){var e,t=this;for(e in this._relations=[],this._config.filterRelation){var n=this._config.filterRelation[e];this._relations[e]=s(n).get(0),s(this._relations[e]).change(function(e){t._element.value="",s(t._element).change(),t._items=[]})}},n._hideDropdown=function(){this._isShown=!1,this._dropdown.classList.remove("show")},n._hideSpinner=function(){this._spinner.style.display="none"},n._makeDropdown=function(){this._element.parentNode.style.position="relative";this._dropdown=s('<div class="dropdown-menu" style="width:100%"></div>').appendTo(this._element.parentNode).get(0)},n._makeSpinner=function(){this._spinner=s('<div class="spinner-border spinner-border-sm text-secondary" role="status"></div>').appendTo(this._element.parentNode).get(0),s(this._spinner).css({position:"absolute",right:s(this._element).css("padding-right"),top:this._element.offsetTop+(this._element.offsetHeight-this._spinner.offsetHeight)/2+"px"}),this._hideSpinner()},n._renderItem=function(e){var i=this;e.forEach(function(e){var t,n;i._dropdown.children.length>=i._config.maxResult||(n=(t=s('<a class="dropdown-item" href="#"></a>')).get(0),t.text(e).appendTo(i._dropdown),i._config.onItemRendered&&i._config.onItemRendered(i._element,n),n=s.Event(d.ITEM_RENDER,{item:n}),s(i._element).trigger(n),t.on(d.CLICK_DATA_API,function(e){i._selectItem(e.target),i._preventClose=!0,i.hide(),e.preventDefault(),i._preventClose=!1}))})},n._selectItem=function(e){this._element.value=e.innerText,this._config.onPick&&this._config.onPick(this._element,e);e=s.Event(d.PICK,{item:e});s(this._element).trigger(e)},n._showDropdown=function(){this._isShown=!0,this._dropdown.classList.add("show")},n._showSpinner=function(){this._spinner.style.display="inline-block"},n._truncateDropdown=function(){this._dropdown.innerHTML=""},r._jQueryInterface=function(n,i){return this.each(function(){var e=s(this).data(u),t=o({},f,s(this).data(),"object"==typeof n&&n?n:{});if(e||(e=new r(this,t),s(this).data(u,e)),"string"==typeof n){if("undefined"==typeof e[n])throw new TypeError('No method named "'+n+'"');e[n](i)}})},e=r,t=[{key:"VERSION",get:function(){return"0.2.0"}},{key:"Default",get:function(){return f}}],(n=null)&&i(e.prototype,n),t&&i(e,t),r}();s.fn[a]=w._jQueryInterface,s.fn[a].Constructor=w,s.fn[a].noConflict=function(){return s.fn[a]=h,w._jQueryInterface},e.Autocomplete=w,Object.defineProperty(e,"__esModule",{value:!0})});
-//# sourceMappingURL=bootstrap-autocomplete.min.js.map
Index: c/main/resources/static/js/bootstrap-autocomplete.min.js.map
===================================================================
--- src/main/resources/static/js/bootstrap-autocomplete.min.js.map	(revision a436340967abb97f2cda58184c9eaaa6f91fcea1)
+++ 	(revision )
@@ -1,1 +1,0 @@
-{"version":3,"sources":["../../src/js/util.js","../../src/js/autocomplete.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap (v4.3.1): util.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\n\n/**\n * ------------------------------------------------------------------------\n * Private TransitionEnd Helpers\n * ------------------------------------------------------------------------\n */\n\nconst TRANSITION_END = 'transitionend'\nconst MAX_UID = 1000000\nconst MILLISECONDS_MULTIPLIER = 1000\n\n// Shoutout AngusCroll (https://goo.gl/pxwQGp)\nfunction toType(obj) {\n  return {}.toString.call(obj).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\nfunction getSpecialTransitionEndEvent() {\n  return {\n    bindType: TRANSITION_END,\n    delegateType: TRANSITION_END,\n    handle(event) {\n      if ($(event.target).is(this)) {\n        return event.handleObj.handler.apply(this, arguments) // eslint-disable-line prefer-rest-params\n      }\n      return undefined // eslint-disable-line no-undefined\n    }\n  }\n}\n\nfunction transitionEndEmulator(duration) {\n  let called = false\n\n  $(this).one(Util.TRANSITION_END, () => {\n    called = true\n  })\n\n  setTimeout(() => {\n    if (!called) {\n      Util.triggerTransitionEnd(this)\n    }\n  }, duration)\n\n  return this\n}\n\nfunction setTransitionEndSupport() {\n  $.fn.emulateTransitionEnd = transitionEndEmulator\n  $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent()\n}\n\n/**\n * --------------------------------------------------------------------------\n * Public Util Api\n * --------------------------------------------------------------------------\n */\n\nconst Util = {\n\n  TRANSITION_END: 'bsTransitionEnd',\n\n  getUID(prefix) {\n    do {\n      // eslint-disable-next-line no-bitwise\n      prefix += ~~(Math.random() * MAX_UID) // \"~~\" acts like a faster Math.floor() here\n    } while (document.getElementById(prefix))\n    return prefix\n  },\n\n  getSelectorFromElement(element) {\n    let selector = element.getAttribute('data-target')\n\n    if (!selector || selector === '#') {\n      const hrefAttr = element.getAttribute('href')\n      selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''\n    }\n\n    try {\n      return document.querySelector(selector) ? selector : null\n    } catch (err) {\n      return null\n    }\n  },\n\n  getTransitionDurationFromElement(element) {\n    if (!element) {\n      return 0\n    }\n\n    // Get transition-duration of the element\n    let transitionDuration = $(element).css('transition-duration')\n    let transitionDelay = $(element).css('transition-delay')\n\n    const floatTransitionDuration = parseFloat(transitionDuration)\n    const floatTransitionDelay = parseFloat(transitionDelay)\n\n    // Return 0 if element or transition duration is not found\n    if (!floatTransitionDuration && !floatTransitionDelay) {\n      return 0\n    }\n\n    // If multiple durations are defined, take the first\n    transitionDuration = transitionDuration.split(',')[0]\n    transitionDelay = transitionDelay.split(',')[0]\n\n    return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n  },\n\n  reflow(element) {\n    return element.offsetHeight\n  },\n\n  triggerTransitionEnd(element) {\n    $(element).trigger(TRANSITION_END)\n  },\n\n  // TODO: Remove in v5\n  supportsTransitionEnd() {\n    return Boolean(TRANSITION_END)\n  },\n\n  isElement(obj) {\n    return (obj[0] || obj).nodeType\n  },\n\n  typeCheckConfig(componentName, config, configTypes) {\n    for (const property in configTypes) {\n      if (Object.prototype.hasOwnProperty.call(configTypes, property)) {\n        const expectedTypes = configTypes[property]\n        const value         = config[property]\n        const valueType     = value && Util.isElement(value)\n          ? 'element' : toType(value)\n\n        if (!new RegExp(expectedTypes).test(valueType)) {\n          throw new Error(\n            `${componentName.toUpperCase()}: ` +\n            `Option \"${property}\" provided type \"${valueType}\" ` +\n            `but expected type \"${expectedTypes}\".`)\n        }\n      }\n    }\n  },\n\n  findShadowRoot(element) {\n    if (!document.documentElement.attachShadow) {\n      return null\n    }\n\n    // Can find the shadow root otherwise it'll return the document\n    if (typeof element.getRootNode === 'function') {\n      const root = element.getRootNode()\n      return root instanceof ShadowRoot ? root : null\n    }\n\n    if (element instanceof ShadowRoot) {\n      return element\n    }\n\n    // when we don't find a shadow root\n    if (!element.parentNode) {\n      return null\n    }\n\n    return Util.findShadowRoot(element.parentNode)\n  }\n}\n\nsetTransitionEndSupport()\n\nexport default Util\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap Autocomplete (v0.2.0): autocomplete.js\n * Licensed under MIT (https://github.com/iqbalfn/bootstrap-autocomplete/blob/master/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport $ from 'jquery'\nimport Util from './util'\n\n/**\n * ------------------------------------------------------------------------\n * Constants\n * ------------------------------------------------------------------------\n */\n\nconst NAME               = 'autocomplete'\nconst VERSION            = '0.2.0'\nconst DATA_KEY           = 'bs.autocomplete'\nconst EVENT_KEY          = `.${DATA_KEY}`\nconst DATA_API_KEY       = '.data-api'\nconst JQUERY_NO_CONFLICT = $.fn[NAME]\n\nconst Default = {\n    list            : null,\n\n    prefetch        : null,\n\n    filter          : null,\n    filterDelay     : 300,\n    filterMinChars  : 1,\n    filterRelation  : null,\n\n    maxResult       : 10,\n\n    onPick          : null,\n    onItemRendered  : null,\n\n    preProcess      : null\n}\n\nconst DefaultType = {\n    list            : '(null|string|element)',\n\n    prefetch        : '(null|string)',\n\n    filter          : '(null|string)',\n    filterDelay     : 'number',\n    filterMinChars  : 'number',\n    filterRelation  : '(null|object)',\n\n    maxResult       : 'number',\n\n    preProcess      : '(null|function)',\n\n    onPick          : '(null|function)',\n    onItemRendered  : '(null|function)'\n}\n\nconst Event = {\n    BLUR_DATA_API       : `blur${EVENT_KEY}${DATA_API_KEY}`,\n    CLICK_DATA_API      : `click${EVENT_KEY}${DATA_API_KEY}`,\n    KEYDOWN_DATA_API    : `keydown${EVENT_KEY}${DATA_API_KEY}`,\n    INPUT_DATA_API      : `input${EVENT_KEY}${DATA_API_KEY}`,\n\n    PICK                : `pick${EVENT_KEY}`,\n    ITEM_RENDER         : `itemrender${EVENT_KEY}`\n}\n\nconst ClassName = {\n    DROPDOWN_MENU : 'dropdown-menu',\n    DROPDOWN_ITEM : 'dropdown-item'\n}\n\nconst KeyCode = {\n    ARROW_DOWN  : 40,\n    ARROW_UP    : 38,\n    ENTER       : 13,\n    ESCAPE      : 27\n}\n\nconst Selector = {}\n\n/**\n * ------------------------------------------------------------------------\n * Class Definition\n * ------------------------------------------------------------------------\n */\n\nclass Autocomplete {\n    constructor(element, config) {\n        this._config    = this._getConfig(config)\n        this._element   = element\n\n        this._items     = []\n        this._labels    = {}\n\n        this._isShown   = false\n        this._dropdown  = null\n        this._spinner   = null\n        this._result    = []\n        this._query     = ''\n        this._preventClose = false\n        this._timer     = null\n        this._relations = null\n\n        if(element.hasAttribute('list')){\n            this._config.list = '#' + element.getAttribute('list')\n            element.removeAttribute('list')\n        }\n\n        if(!this._config.list && !this._config.prefetch && !this._config.filter)\n            throw new TypeError('No data source provided')\n\n        if(this._config.filterRelation)\n            this._handleRelations()\n\n        element.setAttribute('autocomplete', 'off')\n\n        this._makeDropdown()\n        this._makeSpinner()\n        this._fetchPresetData()\n        this._addElementListener()\n    }\n\n    // Getters\n\n    static get VERSION() {\n        return VERSION\n    }\n\n    static get Default() {\n        return Default\n    }\n\n    // Public\n\n    show(){\n        if(this._isShown)\n            return\n\n        if(this._result.length)\n            this._showDropdown()\n    }\n\n    hide(){\n        if(!this._isShown)\n            return\n\n        this._hideDropdown()\n    }\n\n    dispose() {\n        $(this._element).off(EVENT_KEY)\n\n        $.removeData(this._element, DATA_KEY)\n\n        this._config    = null\n        this._element   = null\n        this._items     = null\n        this._labels    = null\n        this._isShown   = null\n        this._dropdown  = null\n        this._spinner   = null\n        this._result    = null\n        this._query     = null\n        this._preventClose = null\n        if(this._timer)\n            clearTimeout(this._timer)\n        this._timer     = null\n    }\n\n    // Private\n\n    _addElementListener(){\n        $(this._element).on(Event.KEYDOWN_DATA_API, e => {\n            let prevent = false\n\n            switch(e.keyCode){\n                case KeyCode.ARROW_DOWN:\n                    if(e.altKey && !this._isShown){\n                        this._query = this._element.value.trim().toLowerCase()\n\n                        if(this._query){\n                            this._findFromList()\n                            prevent = true\n                        }\n                    }else{\n                        this._focusNext()\n                        prevent = true\n                    }\n                    break;\n\n                case KeyCode.ARROW_UP:\n                    this._focusPrev()\n                    prevent = true\n                    break;\n\n                case KeyCode.ENTER:\n                    if(this._isShown){\n                        let item = $(this._dropdown).children('.active').get(0)\n                        if(!item)\n                            item = $(this._dropdown).children(':first-child').get(0)\n\n                        if(item)\n                            this._selectItem(item)\n\n                        this.hide()\n                        prevent = true\n                    }\n                    break;\n\n                case KeyCode.ESCAPE:\n                    prevent = true\n                    this.hide()\n                    break;\n            }\n\n            if(prevent)\n                e.preventDefault()\n        })\n\n        $(this._element).on(Event.INPUT_DATA_API, e => {\n            this._query = this._element.value.trim().toLowerCase()\n\n            if(!this._query){\n                this._truncateDropdown()\n                this.hide()\n            }else{\n                this._findFromList()\n            }\n        })\n\n        $(this._element).on(Event.BLUR_DATA_API, e => {\n            if(this._preventClose)\n                return\n            setTimeout(() => this.hide(), 150)\n        })\n    }\n\n    _fetchPresetData(){\n        // from datalist\n        if(this._config.list){\n            let dataList = this._config.list\n            if(typeof dataList === 'string')\n                dataList = document.querySelector(this._config.list)\n\n            if(dataList){\n                Array.from(dataList.children).forEach(o => {\n                    let val = o.innerHTML.toLowerCase()\n                    if(this._items.includes(val))\n                        return\n\n                    this._items.push(val)\n                    this._labels[val] = o.innerHTML\n                })\n            }\n        }\n\n        // from prefetch\n        if(this._config.prefetch){\n            this._showSpinner()\n            $.get(this._config.prefetch, res => {\n                this._hideSpinner()\n                if(this._config.preProcess)\n                    res = this._config.preProcess(res)\n\n                res.forEach(i => {\n                    let val = i.toLowerCase()\n                    if(this._items.includes(val))\n                        return\n                    this._items.push(val)\n                    this._labels[val] = i\n                })\n            })\n        }\n    }\n\n    _findFromAjax(){\n        if(!this._config.filter)\n            return\n        if(this._dropdown.children.length >= this._config.maxResult)\n            return\n\n        if(this._timer)\n            clearTimeout(this._timer)\n\n        let vval = this._query\n        this._timer = setTimeout(() => {\n            if(vval != this._query)\n                return\n            this._showSpinner()\n\n            let url = this._config.filter\n                .replace(/%23/g, '#')\n                .replace('#QUERY#', this._query)\n\n            if(this._relations){\n                let sep = url.includes('?') ? '&' : '?'\n\n                for(let k in this._relations){\n                    let el = this._relations[k]\n                    let val= $(el).val()\n                    if(!val)\n                        continue;\n\n                    url+= `${sep}${k}=${val}`\n                    sep = '&'\n                }\n            }\n\n            $.get(url, res => {\n                this._hideSpinner()\n                if(this._config.preProcess)\n                    res = this._config.preProcess(res)\n\n                let local = []\n                res.forEach(i => {\n                    let val = i.toLowerCase()\n                    if(this._items.includes(val))\n                        return\n\n                    this._items.push(val)\n                    this._labels[val] = i\n\n                    local.push(i)\n                    this._result.push(i)\n                })\n\n                if(local.length)\n                    this._renderItem(local)\n\n                if(this._result.length)\n                    this.show()\n                else\n                    this.hide()\n            })\n        }, this._config.filterDelay)\n    }\n\n    _findFromList(){\n        this._truncateDropdown()\n        this._result = []\n\n        let local = []\n        this._items.forEach(i => {\n            if(!i.includes(this._query))\n                return\n\n            let label = this._labels[i]\n\n            if(this._result.includes(label))\n                return\n\n            local.push(label)\n            this._result.push(label)\n        })\n\n        // now render the result\n        if(local.length){\n            this._renderItem(local)\n            this.show()\n        }else{\n            this.hide()\n        }\n\n        this._findFromAjax()\n    }\n\n    _focusNext(){\n        let next = $(this._dropdown).children(':first-child').get(0)\n        let focused = $(this._dropdown).children('.active').get(0)\n\n        if(focused){\n            focused.classList.remove('active')\n            let tmpNext = $(focused).next().get(0)\n            if(tmpNext)\n                next = tmpNext\n        }\n\n        if(next)\n            next.classList.add('active')\n    }\n\n    _focusPrev(){\n        let next = $(this._dropdown).children(':last-child').get(0)\n        let focused = $(this._dropdown).children('.active').get(0)\n\n        if(focused){\n            focused.classList.remove('active')\n            let tmpNext = $(focused).prev().get(0)\n            if(tmpNext)\n                next = tmpNext\n        }\n\n        if(next)\n            next.classList.add('active')\n    }\n\n    _getConfig(config) {\n        config = {\n            ...Default,\n            ...config\n        }\n        Util.typeCheckConfig(NAME, config, DefaultType)\n        return config\n    }\n\n    _handleRelations(){\n        this._relations = []\n        for(let name in this._config.filterRelation){\n            let selector = this._config.filterRelation[name];\n            this._relations[name] = $(selector).get(0)\n            $(this._relations[name]).change(e => {\n                this._element.value = ''\n                $(this._element).change() // we need to trigger this manually\n                this._items = []\n            });\n        }\n    }\n\n    _hideDropdown(){\n        this._isShown = false\n        this._dropdown.classList.remove('show')\n    }\n\n    _hideSpinner(){\n        this._spinner.style.display = 'none'\n    }\n\n    _makeDropdown(){\n        this._element.parentNode.style.position = 'relative'\n\n        let tmpl = '<div class=\"dropdown-menu\" style=\"width:100%\"></div>'\n\n        this._dropdown = $(tmpl).appendTo(this._element.parentNode).get(0)\n\n    }\n\n    _makeSpinner(){\n        let tmpl = '<div class=\"spinner-border spinner-border-sm text-secondary\" role=\"status\"></div>'\n\n        this._spinner = $(tmpl).appendTo(this._element.parentNode).get(0)\n\n        $(this._spinner).css({\n            position : 'absolute',\n            right    : $(this._element).css('padding-right'),\n            top      : (this._element.offsetTop + ((this._element.offsetHeight - this._spinner.offsetHeight)/2)) + 'px'\n        })\n\n        this._hideSpinner()\n    }\n\n    _renderItem(items){\n        items.forEach(i => {\n            if(this._dropdown.children.length >= this._config.maxResult)\n                return\n\n            let item = $('<a class=\"dropdown-item\" href=\"#\"></a>')\n            let itemEl = item.get(0)\n\n            item.text(i).appendTo(this._dropdown)\n\n            if(this._config.onItemRendered)\n                this._config.onItemRendered(this._element, itemEl)\n\n            const renderEvent = $.Event(Event.ITEM_RENDER, {item:itemEl})\n\n            $(this._element).trigger(renderEvent)\n\n            item.on(Event.CLICK_DATA_API, e => {\n                this._selectItem(e.target);\n                this._preventClose  = true\n                this.hide()\n                e.preventDefault()\n                this._preventClose = false\n            })\n        })\n    }\n\n    _selectItem(item){\n        this._element.value = item.innerText\n\n        if(this._config.onPick)\n            this._config.onPick(this._element, item)\n\n        const pickEvent = $.Event(Event.PICK, {item})\n        $(this._element).trigger(pickEvent)\n    }\n\n    _showDropdown(){\n        this._isShown = true\n        this._dropdown.classList.add('show')\n    }\n\n    _showSpinner(){\n        this._spinner.style.display = 'inline-block'\n    }\n\n    _truncateDropdown(){\n        this._dropdown.innerHTML = ''\n    }\n\n    // Static\n\n    static _jQueryInterface(config, relatedTarget) {\n        return this.each(function () {\n            let data = $(this).data(DATA_KEY)\n            const _config = {\n                ...Default,\n                ...$(this).data(),\n                ...typeof config === 'object' && config ? config : {}\n            }\n\n            if (!data) {\n                data = new Autocomplete(this, _config)\n                $(this).data(DATA_KEY, data)\n            }\n\n            if (typeof config === 'string') {\n                if (typeof data[config] === 'undefined')\n                    throw new TypeError(`No method named \"${config}\"`)\n                data[config](relatedTarget)\n            }\n        })\n    }\n}\n\n/**\n * ------------------------------------------------------------------------\n * jQuery\n * ------------------------------------------------------------------------\n */\n\n$.fn[NAME] = Autocomplete._jQueryInterface\n$.fn[NAME].Constructor = Autocomplete\n$.fn[NAME].noConflict = () => {\n  $.fn[NAME] = JQUERY_NO_CONFLICT\n  return Autocomplete._jQueryInterface\n}\n\nexport default Autocomplete\n"],"names":["TRANSITION_END","transitionEndEmulator","duration","_this","this","called","$","one","Util","setTimeout","triggerTransitionEnd","getUID","prefix","Math","random","document","getElementById","getSelectorFromElement","element","selector","getAttribute","hrefAttr","trim","querySelector","err","getTransitionDurationFromElement","transitionDuration","css","transitionDelay","floatTransitionDuration","parseFloat","floatTransitionDelay","split","reflow","offsetHeight","trigger","supportsTransitionEnd","Boolean","isElement","obj","nodeType","typeCheckConfig","componentName","config","configTypes","property","Object","prototype","hasOwnProperty","call","expectedTypes","value","valueType","toString","match","toLowerCase","RegExp","test","Error","toUpperCase","findShadowRoot","documentElement","attachShadow","getRootNode","ShadowRoot","parentNode","root","fn","emulateTransitionEnd","event","special","bindType","delegateType","handle","target","is","handleObj","handler","apply","arguments","NAME","DATA_KEY","EVENT_KEY","DATA_API_KEY","JQUERY_NO_CONFLICT","Default","list","prefetch","filter","filterDelay","filterMinChars","filterRelation","maxResult","onPick","onItemRendered","preProcess","DefaultType","Event","BLUR_DATA_API","CLICK_DATA_API","KEYDOWN_DATA_API","INPUT_DATA_API","PICK","ITEM_RENDER","KeyCode","Autocomplete","_config","_getConfig","_element","_items","_labels","_isShown","_dropdown","_spinner","_result","_query","_preventClose","_timer","_relations","hasAttribute","removeAttribute","TypeError","_handleRelations","setAttribute","_makeDropdown","_makeSpinner","_fetchPresetData","_addElementListener","show","length","_showDropdown","hide","_hideDropdown","dispose","off","removeData","clearTimeout","on","e","item","prevent","keyCode","altKey","_findFromList","_focusNext","_focusPrev","children","get","_selectItem","preventDefault","_truncateDropdown","dataList","_this2","Array","from","forEach","o","val","innerHTML","includes","push","_showSpinner","res","_hideSpinner","i","_findFromAjax","vval","_this3","url","replace","k","sep","el","local","_renderItem","_this4","label","next","focused","classList","remove","tmpNext","add","prev","_objectSpread","name","_this5","change","style","display","position","appendTo","right","top","offsetTop","items","_this6","renderEvent","itemEl","text","innerText","pickEvent","_jQueryInterface","relatedTarget","each","data","Constructor","noConflict"],"mappings":"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"}
Index: src/main/resources/static/js/register_business.js
===================================================================
--- src/main/resources/static/js/register_business.js	(revision a436340967abb97f2cda58184c9eaaa6f91fcea1)
+++ src/main/resources/static/js/register_business.js	(revision 2b0a4db95e071b47a10460f6bb4d73d43885fb9c)
@@ -9,6 +9,5 @@
 
         $.each(data, function(index, obj) {
-            $el.append($("<option></option>")
-                .attr("value", obj.value).text(obj.text));
+            $el.append("<option value=" + obj.value + ">" + obj.text + "</option>");
         });
     });
@@ -16,10 +15,17 @@
     $("#companyType").change(function() {
         var selectedVal = $(this).find(':selected').val();
-        var selectedText = $(this).find(':selected').text();
         alert(JSON.stringify(enumerations[selectedVal-1]));
+        var selectedObj = enumerations[selectedVal-1];
+        var $el = $("#predefined_services");
+        $el.empty();
+        $.each(selectedObj['serviceTypes'], function (index, obj) {
+            $el.append(
+                '<div class="form-check">\n' +
+                '    <input class="form-check-input" type="checkbox" value=\"' + obj.id + '\" id=\"'+ obj.id +'\">\n' +
+                '        <label class="form-check-label" for=\"' + obj.id + '\">\n' +
+                              obj.name +
+                '         </label>\n' +
+                '    </div>')
+        });
     })
 });
-
-document.addEventListener('DOMContentLoaded', e => {
-    $('#input-prefetch').autocomplete()
-}, false);
Index: src/main/resources/templates/homepage.html
===================================================================
--- src/main/resources/templates/homepage.html	(revision a436340967abb97f2cda58184c9eaaa6f91fcea1)
+++ src/main/resources/templates/homepage.html	(revision 2b0a4db95e071b47a10460f6bb4d73d43885fb9c)
@@ -7,13 +7,13 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
 
-    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet" />
+    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet"/>
     <!-- Google Fonts -->
-    <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
+    <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet"/>
     <!-- MDB -->
-    <link href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/5.0.0/mdb.min.css" rel="stylesheet" />
+    <link href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/5.0.0/mdb.min.css" rel="stylesheet"/>
 
     <link href='css/fullcalendar.css' rel='stylesheet'/>
     <link href='css/fullcalendar.print.css' rel='stylesheet' media='print'/>
-    <link href="css/homepage.css" rel="stylesheet" />
+    <link href="css/homepage.css" rel="stylesheet"/>
     <link href="css/headers.css" rel="stylesheet">
 </head>
@@ -25,5 +25,7 @@
         <div class="d-flex flex-wrap align-items-center justify-content-center justify-content-lg-start">
             <a href="/" class="d-flex align-items-center mb-2 mb-lg-0 text-dark text-decoration-none">
-                <svg class="bi me-2" width="40" height="32" role="img" aria-label="Bootstrap"><use xlink:href="#bootstrap"/></svg>
+                <svg class="bi me-2" width="40" height="32" role="img" aria-label="Bootstrap">
+                    <use xlink:href="#bootstrap"/>
+                </svg>
             </a>
 
@@ -40,5 +42,6 @@
 
             <div class="dropdown text-end">
-                <a href="#" class="d-block link-dark text-decoration-none dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
+                <a href="#" class="d-block link-dark text-decoration-none dropdown-toggle" data-bs-toggle="dropdown"
+                   aria-expanded="false">
                     <img src="https://github.com/mdo.png" alt="mdo" width="32" height="32" class="rounded-circle">
                 </a>
@@ -47,5 +50,7 @@
                     <li><a class="dropdown-item" href="#">Settings</a></li>
                     <li><a class="dropdown-item" href="#">Profile</a></li>
-                    <li><hr class="dropdown-divider"></li>
+                    <li>
+                        <hr class="dropdown-divider">
+                    </li>
                     <li><a class="dropdown-item" href="#">Sign out</a></li>
                 </ul>
@@ -64,11 +69,11 @@
     <div class="card">
         <div class="card-body py-5 px-md-5">
-                <div>
-                    <label for="student-birth-date">Date of search:</label>
-                    <input type="date" id="student-birth-date"/>
-                </div>
-                <div>
-                    <button type="submit" class="button" id="search">Search</button>
-                </div>
+            <div>
+                <label for="student-birth-date">Date of search:</label>
+                <input type="date" id="student-birth-date"/>
+            </div>
+            <div>
+                <button type="submit" class="button" id="search">Search</button>
+            </div>
         </div>
     </div>
Index: src/main/resources/templates/register_business.html
===================================================================
--- src/main/resources/templates/register_business.html	(revision a436340967abb97f2cda58184c9eaaa6f91fcea1)
+++ src/main/resources/templates/register_business.html	(revision 2b0a4db95e071b47a10460f6bb4d73d43885fb9c)
@@ -5,19 +5,7 @@
     <title>Schedlr</title>
 
-    <!-- Font Awesome -->
-    <link
-            href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css"
-            rel="stylesheet"
-    />
-    <!-- Google Fonts -->
-    <link
-            href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
-            rel="stylesheet"
-    />
-    <!-- MDB -->
-    <link
-            href="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/5.0.0/mdb.min.css"
-            rel="stylesheet"
-    />
+    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet"
+          integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
+
     <link rel="stylesheet" href="css/login.css">
 
@@ -29,5 +17,5 @@
             <div class="col-lg-6 mb-5 mb-lg-0">
                 <h1 class="my-5 display-3 fw-bold ls-tight">
-                    Register as  <br />
+                    Register as <br/>
                     <span class="text-primary">a business</span>
                 </h1>
@@ -49,12 +37,12 @@
                                 <div class="col-md-6 mb-4">
                                     <div class="form-outline">
-                                        <input type="text" id="firstName" class="form-control" />
-                                        <label class="form-label" for="firstName">First name</label>
+                                        <input type="text" id="firstName" class="form-control" placeholder="Username"
+                                               aria-label="Username"/>
                                     </div>
                                 </div>
                                 <div class="col-md-6 mb-4">
                                     <div class="form-outline">
-                                        <input type="text" id="lastName" class="form-control" />
-                                        <label class="form-label" for="lastName">Last name</label>
+                                        <input type="text" id="lastName" class="form-control" placeholder="Last name"
+                                               aria-label="lastname"/>
                                     </div>
                                 </div>
@@ -63,18 +51,18 @@
                             <!-- Email input -->
                             <div class="form-outline mb-4">
-                                <input type="email" id="email" class="form-control" />
-                                <label class="form-label" for="email">Email address</label>
+                                <input type="email" id="email" class="form-control" placeholder="Email"
+                                       aria-label="Email"/>
                             </div>
 
                             <!-- Email input -->
                             <div class="form-outline mb-4">
-                                <input type="email" id="username" class="form-control" />
-                                <label class="form-label" for="username">Username</label>
+                                <input type="text" id="username" class="form-control" placeholder="Username"
+                                       aria-label="username"/>
                             </div>
 
                             <!-- Password input -->
                             <div class="form-outline mb-4">
-                                <input type="password" id="password" class="form-control" />
-                                <label class="form-label" for="password">Password</label>
+                                <input type="password" id="password" class="form-control" placeholder="Password"
+                                       aria-label="password"/>
                             </div>
 
@@ -84,19 +72,32 @@
 
                             <div class="form-outline mb-4">
-                                <input type="email" id="companyName" class="form-control" />
-                                <label class="form-label" for="companyName">Company Name</label>
+                                <input type="email" id="companyName" class="form-control" placeholder="Company Name"
+                                       aria-label="companyName"/>
                             </div>
 
                             <div class="form-outline mb-4">
-                                <select class="form-select" id="companyType">
-                                    <option value="" disabled selected hidden>Company Type</option>
+                                <select class="form-select" id="companyType" aria-label="Default select example">
+                                    <option disabled selected hidden>Company Type</option>
                                 </select>
                             </div>
 
-                            <div class="form-group form-outline mb-4">
-                                <label for="services">Services</label>
-                                <input type="text" class="form-control" placeholder="Services" list="list-timezone" id="services">
-                                <datalist id="list-timezone">
-                                </datalist>
+                            <div class="text-center">
+                                <p>Select from the predefined services or add a new one</p>
+                            </div>
+
+                            <div class="row">
+                                <div class="form-outline col-md-10">
+                                    <div class="form-outline">
+                                        <input type="text" id="services" class="form-control" placeholder="Services"
+                                               aria-label="services"/>
+                                    </div>
+                                </div>
+                                <div class="form-outline col-md-2 d-grid">
+                                    <button class="btn btn-primary" id="add_service">Add</button>
+                                </div>
+                            </div>
+
+
+                            <div id="predefined_services" class="form-outline mb-4">
                             </div>
 
@@ -113,11 +114,13 @@
     </div>
 </div>
-<script src='js/jquery-1.10.2.js' type="text/javascript"></script>
-<script
-        type="text/javascript"
-        src="https://cdnjs.cloudflare.com/ajax/libs/mdb-ui-kit/5.0.0/mdb.min.js"
-></script>
+<!-- jQuery library -->
+<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"
+        integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4"
+        crossorigin="anonymous"></script>
+<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js"
+        integrity="sha384-oBqDVmMz9ATKxIep9tiCxS/Z9fNfEXiDAYTujMAeBAsjFuCZSmKbSSUnQlmh/jp3"
+        crossorigin="anonymous"></script>
+<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.3/jquery.min.js"></script>
 <script src="js/register_business.js" type="text/javascript"></script>
-<script src="js/bootstrap-autocomplete.min.js"></script>
 </body>
 </html>
