diff --git a/app/assets/javascripts/admin/communication/menu_items.js b/app/assets/javascripts/admin/communication/menu_items.js
index 8f09233430f66c39004a486190ba6dab578452b0..25a915265c6d4d82fe2789ca19d3d06a781b1c15 100644
--- a/app/assets/javascripts/admin/communication/menu_items.js
+++ b/app/assets/javascripts/admin/communication/menu_items.js
@@ -1,16 +1,13 @@
+/* global $ */
 window.osuny.communication.menuItems = {
     init: function () {
         'use strict';
-        this.kindInput = document.querySelector('form #communication_website_menu_item_kind');
+        this.kindInput = document.querySelector('form .js-kind-input');
         if (this.kindInput === null) {
             return;
         }
 
-        this.elementsForKindUrl = document.querySelectorAll('.kind-url');
-        this.requiredInputsForKindUrl = document.querySelectorAll('.kind-url .required select, .kind-url .required input');
-
-        this.elementsForKindPage = document.querySelectorAll('.kind-page');
-        this.requiredInputsForKindPage = document.querySelectorAll('.kind-page .required select, .kind-page .required input');
+        this.switchUrl = this.kindInput.dataset.url;
 
         this.kindInput.addEventListener('change', this.onKindChange.bind(this));
         this.onKindChange();
@@ -20,38 +17,12 @@ window.osuny.communication.menuItems = {
         'use strict';
         var kind = this.kindInput.value;
 
-        if (kind === 'url') {
-            this.showElements(this.elementsForKindUrl, this.requiredInputsForKindUrl);
-            this.hideElements(this.elementsForKindPage, this.requiredInputsForKindPage);
-        } else if (kind === 'page') {
-            this.showElements(this.elementsForKindPage, this.requiredInputsForKindPage);
-            this.hideElements(this.elementsForKindUrl, this.requiredInputsForKindUrl);
-        } else if (kind === 'blank') {
-            this.hideElements(this.elementsForKindPage, this.requiredInputsForKindPage);
-            this.hideElements(this.elementsForKindUrl, this.requiredInputsForKindUrl);
-        }
-    },
-
-    showElements: function (elements, requiredInputs) {
-        'use strict';
-        var i;
-        for (i = 0; i < elements.length; i += 1) {
-            elements[i].classList.remove('d-none');
-        }
-        for (i = 0; i < requiredInputs.length; i += 1) {
-            requiredInputs[i].setAttribute('required', 'required');
-        }
-    },
-
-    hideElements: function (elements, requiredInputs) {
-        'use strict';
-        var i;
-        for (i = 0; i < elements.length; i += 1) {
-            elements[i].classList.add('d-none');
-        }
-        for (i = 0; i < requiredInputs.length; i += 1) {
-            requiredInputs[i].removeAttribute('required');
-        }
+        $.ajax(this.switchUrl, {
+            method: 'GET',
+            data: 'kind=' + kind,
+            processData: false,
+            contentType: false
+        });
     },
 
     invoke: function () {
diff --git a/app/controllers/admin/communication/website/menu/items_controller.rb b/app/controllers/admin/communication/website/menu/items_controller.rb
index 6f1ca68595e3a759b037f742824d81b64eb6913f..b996c1f3bced137ce73341731db2647513ac8c8b 100644
--- a/app/controllers/admin/communication/website/menu/items_controller.rb
+++ b/app/controllers/admin/communication/website/menu/items_controller.rb
@@ -25,6 +25,12 @@ class Admin::Communication::Website::Menu::ItemsController < Admin::Communicatio
     @children = @item.children.ordered
   end
 
+  def kind_switch
+    return unless request.xhr?
+    @kind = params[:kind]
+    return if @kind.blank?
+  end
+
   def new
     @item.menu = @menu
     @item.website = @website
diff --git a/app/views/admin/communication/website/menu/items/_form.html.erb b/app/views/admin/communication/website/menu/items/_form.html.erb
index 07bc0ba37bf007e1ac9b8a04c349847dff78506c..c5ae967ca872d33ea276eb1046c66b9cb680681d 100644
--- a/app/views/admin/communication/website/menu/items/_form.html.erb
+++ b/app/views/admin/communication/website/menu/items/_form.html.erb
@@ -11,13 +11,16 @@
           <%= f.input :kind,
                       include_blank: false,
                       label_method: -> (p) { I18n.t(p[1], scope: 'enums.communication/website/menu/item.kind') },
-                      class: 'js-kind-input' %>
-          <div class="kind-url">
+                      input_html: {
+                        class: 'js-kind-input',
+                        data: { url: kind_switch_admin_communication_website_menu_items_path }
+                       } %>
+          <div class="d-none js-url-field">
             <%= f.input :url, as: :string %>
           </div>
-          <div class="kind-page">
-            <%= f.input :about_type, as: :hidden, input_html: { value: 'Communication::Website::Page' } %>
-            <%= f.association :about, collection: @website.list_of_pages, label_method: ->(p) { sanitize p[:label] }, value_method: ->(p) { p[:id] } %>
+          <div class="d-none js-about-fields">
+            <%= f.input :about_type, as: :hidden, input_html: { class: 'js-about-id' } %>
+            <%= f.association :about, collection: @website.list_of_pages, label_method: ->(p) { sanitize p[:label] }, value_method: ->(p) { p[:id] }, input_html: { class: 'js-about-id' } %>
           </div>
         </div>
       </div>
diff --git a/app/views/admin/communication/website/menu/items/kind_switch.js.erb b/app/views/admin/communication/website/menu/items/kind_switch.js.erb
new file mode 100644
index 0000000000000000000000000000000000000000..cbdb12e62bd2c407a28575026cc4cb5e1c2f547c
--- /dev/null
+++ b/app/views/admin/communication/website/menu/items/kind_switch.js.erb
@@ -0,0 +1,31 @@
+function displayAbout(options) {
+    $('.js-url-field').addClass('d-none');
+    $('.js-about-fields').removeClass('d-none');
+    $('.js-about-id').html(options);
+}
+
+function hideAbout() {
+    $('.js-about-fields').addClass('d-none');
+}
+
+<% if @kind == 'url' %>
+    $('.js-url-field').removeClass('d-none');
+    hideAbout();
+<% elsif @kind == 'page' %>
+    <%
+        options = ['<option value="" label=" "></option>']
+        @website.list_of_pages.each do |page|
+            options << "<option value=\"#{page[:id]}\">#{page[:label]}</option>"
+        end
+    %>
+    displayAbout("<%= j(raw(options.join(''))) %>");
+<% elsif @kind == 'program' %>
+    displayAbout();
+<% elsif @kind == 'news_category' %>
+    displayAbout();
+<% elsif @kind == 'news_article' %>
+    displayAbout();
+<% else %>
+    $('.js-url-field').addClass('d-none');
+    hideAbout();
+<% end %>
diff --git a/config/routes/admin/communication.rb b/config/routes/admin/communication.rb
index a42948203171e607d2fc3bfbe28a97e9f8ec724d..0b94e89b9197da0d94009abb9ed40dda2e4aa77c 100644
--- a/config/routes/admin/communication.rb
+++ b/config/routes/admin/communication.rb
@@ -39,6 +39,7 @@ namespace :communication do
     resources :menus, controller: 'website/menus' do
       resources :items, controller: 'website/menu/items', except: :index do
         collection do
+          get :kind_switch
           post :reorder
         end
         member do