diff --git a/src/main/java/org/codelibs/fess/app/service/CrawlingSessionService.java b/src/main/java/org/codelibs/fess/app/service/CrawlingSessionService.java
index f292a581538337552199d396cfb1ce3dfb9ee32f..7c7933ed086d0916ac9b5a90e67db3653c3576dc 100644
--- a/src/main/java/org/codelibs/fess/app/service/CrawlingSessionService.java
+++ b/src/main/java/org/codelibs/fess/app/service/CrawlingSessionService.java
@@ -50,6 +50,7 @@ import org.codelibs.fess.util.ComponentUtil;
 import org.dbflute.bhv.readable.EntityRowHandler;
 import org.dbflute.cbean.result.ListResultBean;
 import org.dbflute.cbean.result.PagingResultBean;
+import org.dbflute.optional.OptionalEntity;
 
 import com.orangesignal.csv.CsvConfig;
 import com.orangesignal.csv.CsvReader;
@@ -87,17 +88,8 @@ public class CrawlingSessionService implements Serializable {
         return crawlingSessionList;
     }
 
-    public CrawlingSession getCrawlingSession(final Map<String, String> keys) {
-        final CrawlingSession crawlingSession = crawlingSessionBhv.selectEntity(cb -> {
-            cb.query().docMeta().setId_Equal(keys.get("id"));
-            setupEntityCondition(cb, keys);
-        }).orElse(null);//TODO
-        if (crawlingSession == null) {
-            // TODO exception?
-            return null;
-        }
-
-        return crawlingSession;
+    public OptionalEntity<CrawlingSession> getCrawlingSession(final String id) {
+        return crawlingSessionBhv.selectByPK(id);
     }
 
     public void store(final CrawlingSession crawlingSession) {
@@ -354,4 +346,4 @@ public class CrawlingSessionService implements Serializable {
         return list.get(0);
     }
 
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/AdminCrawlingsessionAction.java b/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/AdminCrawlingsessionAction.java
index 2ed1dd2e5aa0b8395ac273d7d8d2f6e6b3e77959..6b0df7a887efae73dfc1fd5b650a5b09753dec74 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/AdminCrawlingsessionAction.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/AdminCrawlingsessionAction.java
@@ -16,9 +16,6 @@
 
 package org.codelibs.fess.app.web.admin.crawlingsession;
 
-import java.util.HashMap;
-import java.util.Map;
-
 import javax.annotation.Resource;
 
 import org.codelibs.fess.Constants;
@@ -26,7 +23,6 @@ import org.codelibs.fess.app.pager.CrawlingSessionPager;
 import org.codelibs.fess.app.service.CrawlingSessionService;
 import org.codelibs.fess.app.web.CrudMode;
 import org.codelibs.fess.app.web.base.FessAdminAction;
-import org.codelibs.fess.es.exentity.CrawlingSession;
 import org.codelibs.fess.helper.JobHelper;
 import org.codelibs.fess.helper.SystemHelper;
 import org.lastaflute.web.Execute;
@@ -67,21 +63,22 @@ public class AdminCrawlingsessionAction extends FessAdminAction {
     //                                                                      Search Execute
     //                                                                      ==============
     @Execute
-    public HtmlResponse deleteall(final CrawlingSessionEditForm form) {
+    public HtmlResponse deleteall(final EditForm form) {
+        validate(form, messages -> {}, toIndexHtml());
         crawlingSessionService.deleteOldSessions(jobHelper.getRunningSessionIdSet());
         saveInfo(messages -> messages.addSuccessCrawlingSessionDeleteAll(GLOBAL));
         return redirect(getClass());
     }
 
     @Execute
-    public HtmlResponse index(final CrawlingSessionSearchForm form) {
+    public HtmlResponse index(final SearchForm form) {
         return asHtml(path_AdminCrawlingsession_IndexJsp).renderWith(data -> {
             searchPaging(data, form);
         });
     }
 
     @Execute
-    public HtmlResponse list(final Integer pageNumber, final CrawlingSessionSearchForm form) {
+    public HtmlResponse list(final Integer pageNumber, final SearchForm form) {
         crawlingSessionPager.setCurrentPageNumber(pageNumber);
         return asHtml(path_AdminCrawlingsession_IndexJsp).renderWith(data -> {
             searchPaging(data, form);
@@ -89,15 +86,15 @@ public class AdminCrawlingsessionAction extends FessAdminAction {
     }
 
     @Execute
-    public HtmlResponse search(final CrawlingSessionSearchForm form) {
-        copyBeanToBean(form.searchParams, crawlingSessionPager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
+    public HtmlResponse search(final SearchForm form) {
+        copyBeanToBean(form, crawlingSessionPager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
         return asHtml(path_AdminCrawlingsession_IndexJsp).renderWith(data -> {
             searchPaging(data, form);
         });
     }
 
     @Execute
-    public HtmlResponse reset(final CrawlingSessionSearchForm form) {
+    public HtmlResponse reset(final SearchForm form) {
         crawlingSessionPager.clear();
         return asHtml(path_AdminCrawlingsession_IndexJsp).renderWith(data -> {
             searchPaging(data, form);
@@ -105,17 +102,17 @@ public class AdminCrawlingsessionAction extends FessAdminAction {
     }
 
     @Execute
-    public HtmlResponse back(final CrawlingSessionSearchForm form) {
+    public HtmlResponse back(final SearchForm form) {
         return asHtml(path_AdminCrawlingsession_IndexJsp).renderWith(data -> {
             searchPaging(data, form);
         });
     }
 
-    protected void searchPaging(final RenderData data, final CrawlingSessionSearchForm form) {
+    protected void searchPaging(final RenderData data, final SearchForm form) {
         data.register("crawlingSessionItems", crawlingSessionService.getCrawlingSessionList(crawlingSessionPager)); // page navi
 
         // restore from pager
-        copyBeanToBean(crawlingSessionPager, form.searchParams, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
+        copyBeanToBean(crawlingSessionPager, form, op -> op.include("sessionId"));
     }
 
     // ===================================================================================
@@ -125,18 +122,32 @@ public class AdminCrawlingsessionAction extends FessAdminAction {
     //                                            Entry Page
     //                                            ----------
     @Execute(token = TxToken.SAVE)
-    public HtmlResponse deletepage(final int crudMode, final String id, final CrawlingSessionEditForm form) {
-        form.crudMode = crudMode;
-        form.id = id;
-        verifyCrudMode(form, CrudMode.DELETE);
-        loadCrawlingSession(form);
-        return asHtml(path_AdminCrawlingsession_ConfirmJsp);
+    public HtmlResponse deletepage(final int crudMode, final String id) {
+        verifyCrudMode(crudMode, CrudMode.DELETE);
+        return asHtml(path_AdminCrawlingsession_ConfirmJsp).useForm(EditForm.class, op -> {
+            op.setup(form -> {
+                crawlingSessionService.getCrawlingSession(id).ifPresent(entity -> {
+                    copyBeanToBean(entity, form, copyOp -> {
+                        copyOp.excludeNull();
+                    });
+                }).orElse(() -> {
+                    throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), toIndexHtml());
+                });
+                form.crudMode = crudMode;
+            });
+        });
     }
 
     @Execute(token = TxToken.SAVE)
-    public HtmlResponse deletefromconfirm(final CrawlingSessionEditForm form) {
+    public HtmlResponse deletefromconfirm(final EditForm form) {
         form.crudMode = CrudMode.DELETE;
-        loadCrawlingSession(form);
+        validate(form, messages -> {}, toIndexHtml());
+        String id = form.id;
+        crawlingSessionService.getCrawlingSession(id).ifPresent(entity -> {
+            copyBeanToBean(entity, form, op -> {});
+        }).orElse(() -> {
+            throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), toIndexHtml());
+        });
         return asHtml(path_AdminCrawlingsession_ConfirmJsp);
     }
 
@@ -144,50 +155,48 @@ public class AdminCrawlingsessionAction extends FessAdminAction {
     //                                               Confirm
     //                                               -------
     @Execute
-    public HtmlResponse confirmpage(final int crudMode, final String id, final CrawlingSessionEditForm form) {
-        form.crudMode = crudMode;
-        form.id = id;
-        verifyCrudMode(form, CrudMode.CONFIRM);
-        loadCrawlingSession(form);
-        return asHtml(path_AdminCrawlingsession_ConfirmJsp);
+    public HtmlResponse confirmpage(final int crudMode, final String id) {
+        verifyCrudMode(crudMode, CrudMode.CONFIRM);
+        return asHtml(path_AdminCrawlingsession_ConfirmJsp).useForm(EditForm.class, op -> {
+            op.setup(form -> {
+                crawlingSessionService.getCrawlingSession(id).ifPresent(entity -> {
+                    copyBeanToBean(entity, form, copyOp -> {
+                        copyOp.excludeNull();
+                    });
+                    form.crudMode = crudMode;
+                }).orElse(() -> {
+                    throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), toIndexHtml());
+                });
+            });
+        });
     }
 
     // -----------------------------------------------------
     //                                         Actually Crud
     //                                         -------------
     @Execute
-    public HtmlResponse delete(final CrawlingSessionEditForm form) {
-        verifyCrudMode(form, CrudMode.DELETE);
-        crawlingSessionService.delete(getCrawlingSession(form));
-        saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
+    public HtmlResponse delete(final EditForm form) {
+        verifyCrudMode(form.crudMode, CrudMode.DELETE);
+        validate(form, messages -> {}, toIndexHtml());
+        String id = form.id;
+        crawlingSessionService.getCrawlingSession(id).alwaysPresent(entity -> {
+            crawlingSessionService.delete(entity);
+            saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
+        });
         return redirect(getClass());
     }
 
     // ===================================================================================
     //                                                                        Assist Logic
     //                                                                        ============
-    protected void loadCrawlingSession(final CrawlingSessionEditForm form) {
-        copyBeanToBean(getCrawlingSession(form), form, op -> op.exclude("crudMode"));
-    }
-
-    protected CrawlingSession getCrawlingSession(final CrawlingSessionEditForm form) {
-        final CrawlingSession crawlingSession = crawlingSessionService.getCrawlingSession(createKeyMap(form));
-        return crawlingSession;
-    }
-
-    protected Map<String, String> createKeyMap(final CrawlingSessionEditForm form) {
-        final Map<String, String> keys = new HashMap<String, String>();
-        keys.put("id", form.id);
-        return keys;
-    }
 
     // ===================================================================================
     //                                                                        Small Helper
     //                                                                        ============
-    protected void verifyCrudMode(final CrawlingSessionEditForm form, final int expectedMode) {
-        if (form.crudMode != expectedMode) {
+    protected void verifyCrudMode(final int crudMode, final int expectedMode) {
+        if (crudMode != expectedMode) {
             throwValidationError(messages -> {
-                messages.addErrorsCrudInvalidMode(GLOBAL, String.valueOf(expectedMode), String.valueOf(form.crudMode));
+                messages.addErrorsCrudInvalidMode(GLOBAL, String.valueOf(expectedMode), String.valueOf(crudMode));
             }, toIndexHtml());
         }
     }
@@ -197,4 +206,4 @@ public class AdminCrawlingsessionAction extends FessAdminAction {
             return asHtml(path_AdminCrawlingsession_IndexJsp);
         };
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/CrawlingSessionEditForm.java b/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/EditForm.java
similarity index 69%
rename from src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/CrawlingSessionEditForm.java
rename to src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/EditForm.java
index 503499e6440f2d064ac0ec87c3d9d2cc816837e5..5e4a2f32b6989300bfcc3b024d38b01f9ffe66e4 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/CrawlingSessionEditForm.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/EditForm.java
@@ -18,34 +18,36 @@ package org.codelibs.fess.app.web.admin.crawlingsession;
 
 import java.io.Serializable;
 
+import javax.validation.constraints.Digits;
+import javax.validation.constraints.Size;
+
+import org.lastaflute.web.validation.Required;
+
 /**
- * @author codelibs
+ * @author shinsuke
  * @author Shunji Makino
  */
-public class CrawlingSessionEditForm implements Serializable {
+public class EditForm implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    //@Digits(integer=10, fraction=0)
+    @Digits(integer = 10, fraction = 0)
     public int crudMode;
 
-    //@Required(target = "confirmfromupdate,update,delete")
-    //@Maxbytelength(maxbytelength = 1000)
+    @Required
+    @Size(max = 1000)
     public String id;
 
-    //@Required(target = "confirmfromupdate,update,delete")
-    //@Maxbytelength(maxbytelength = 20)
+    @Required
+    @Size(max = 20)
     public String sessionId;
 
-    //@Maxbytelength(maxbytelength = 20)
+    @Size(max = 20)
     public String name;
 
-    //@DateType
     public String expiredTime;
 
-    //@Required(target = "confirmfromupdate,update,delete")
-    //@DateType
-    public String createdTime;
+    public Long createdTime;
 
     public void initialize() {
 
@@ -56,4 +58,4 @@ public class CrawlingSessionEditForm implements Serializable {
         createdTime = null;
 
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/CrawlingSessionSearchForm.java b/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/SearchForm.java
similarity index 79%
rename from src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/CrawlingSessionSearchForm.java
rename to src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/SearchForm.java
index 1035ee65e618cbbe499cbbc54853d876ad555c58..8957d416e890c21d5aaf9210d39fc16ac364df63 100644
--- a/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/CrawlingSessionSearchForm.java
+++ b/src/main/java/org/codelibs/fess/app/web/admin/crawlingsession/SearchForm.java
@@ -17,16 +17,14 @@
 package org.codelibs.fess.app.web.admin.crawlingsession;
 
 import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
 
 /**
- * @author codelibs
+ * @author shinsuke
  * @author Shunji Makino
  */
-public class CrawlingSessionSearchForm implements Serializable {
+public class SearchForm implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    public Map<String, String> searchParams = new HashMap<String, String>();
-}
+    public String sessionId;
+}
\ No newline at end of file
diff --git a/src/main/webapp/WEB-INF/view/admin/crawlingsession/confirm.jsp b/src/main/webapp/WEB-INF/view/admin/crawlingsession/confirm.jsp
index db5f3ecd149257ed33caef541e526b8ae57855ce..1f7c52781366ba0b1418c87c37323cabbc306c1b 100644
--- a/src/main/webapp/WEB-INF/view/admin/crawlingsession/confirm.jsp
+++ b/src/main/webapp/WEB-INF/view/admin/crawlingsession/confirm.jsp
@@ -94,8 +94,7 @@
 											<tr>
 												<th><la:message
 														key="labels.crawling_session_session_id" /></th>
-												<td><la:link
-														href="${f:url('/admin/searchList/search')}?query=segment:${f:u(sessionId)}">${f:h(sessionId)}</la:link>
+												<td><a href="${f:url('/admin/searchlist/search')}?query=segment:${f:u(sessionId)}">${f:h(sessionId)}</a>
 													<la:hidden property="sessionId" /></td>
 											</tr>
 											<tr>
@@ -127,21 +126,21 @@
 										</button>
 									</c:if>
 									<c:if test="${crudMode == 3}">
-										<button type="submit" class="btn" name="delete"
-											value="<la:message key="labels.crawling_session_button_delete" />">
-											<la:message key="labels.crawling_session_button_delete" />
-										</button>
 										<button type="submit" class="btn" name="back"
 											value="<la:message key="labels.crawling_session_button_back" />">
 											<la:message key="labels.crawling_session_button_back" />
 										</button>
+										<button type="submit" class="btn btn-danger" name="delete"
+											value="<la:message key="labels.crawling_session_button_delete" />">
+											<la:message key="labels.crawling_session_button_delete" />
+										</button>
 									</c:if>
 									<c:if test="${crudMode == 4}">
 										<button type="submit" class="btn" name="back"
 											value="<la:message key="labels.crawling_session_button_back" />">
 											<la:message key="labels.crawling_session_button_back" />
 										</button>
-										<button type="submit" class="btn" name="deletefromconfirm"
+										<button type="submit" class="btn btn-danger" name="deletefromconfirm"
 											value="<la:message key="labels.crawling_session_button_delete" />">
 											<la:message key="labels.crawling_session_button_delete" />
 										</button>
diff --git a/src/main/webapp/WEB-INF/view/admin/crawlingsession/index.jsp b/src/main/webapp/WEB-INF/view/admin/crawlingsession/index.jsp
index 3ee8d45298489ece2a257110a6aa650697d7f2db..fb14af5b81523fc7126c99a99a2f6035dd7b34d5 100644
--- a/src/main/webapp/WEB-INF/view/admin/crawlingsession/index.jsp
+++ b/src/main/webapp/WEB-INF/view/admin/crawlingsession/index.jsp
@@ -46,14 +46,14 @@
 										<label for="sessionIdSearchBtn"><la:message
 												key="labels.crawling_session_session_id_search" /></label>
 										<la:text styleId="sessionIdSearchBtn"
-											property="searchParams.sessionId" styleClass="form-control"></la:text>
+											property="sessionId" styleClass="form-control"></la:text>
 									</div>
 									<div class="form-group">
 										<button type="submit" class="btn btn-primary" name="search"
 											value="<la:message key="labels.crawling_session_search" />">
 											<la:message key="labels.crawling_session_search" />
 										</button>
-										<button type="reset" class="btn btn-secondary" name="reset"
+										<button type="submit" class="btn btn-secondary" name="reset"
 											value="<la:message key="labels.crawling_session_reset" />">
 											<la:message key="labels.crawling_session_reset" />
 										</button>
@@ -81,8 +81,6 @@
 														key="labels.crawling_session_session_id" /></th>
 												<th><la:message
 														key="labels.crawling_session_created_time" /></th>
-												<th><la:message
-														key="labels.crawling_session_expired_time" /></th>
 											</tr>
 										</thead>
 										<tbody>
@@ -91,17 +89,7 @@
 												<tr class="${s.index % 2 == 0 ? 'row1' : 'row2'}"
 													data-href="${contextPath}/admin/crawlingsession/confirmpage/4/${f:u(data.id)}">
 													<td>${f:h(data.sessionId)}</td>
-													<td>${f:h(data.createdTime)}</td>
-													<td><c:if test="${data.expiredTime==null}">
-															<la:message key="labels.none" />
-														</c:if> <c:if test="${data.expiredTime!=null}">${f:h(data.expiredTime)}</c:if>
-													</td>
-													<td style="overflow-x: auto;"><la:link
-															href="confirmpage/4/${f:u(data.id)}">
-															<la:message key="labels.crawling_session_link_details" />
-														</la:link> <la:link href="deletepage/3/${f:u(data.id)}">
-															<la:message key="labels.crawling_session_link_delete" />
-														</la:link></td>
+													<td><fmt:formatDate value="${fe:date(data.createdTime)}" pattern="yyyy-MM-dd'T'HH:mm:ss" /></td>
 												</tr>
 											</c:forEach>
 										</tbody>