diff --git a/module/convert/ui/mapjira2zentao.html.php b/module/convert/ui/mapjira2zentao.html.php
new file mode 100644
index 0000000000..50811980b9
--- /dev/null
+++ b/module/convert/ui/mapjira2zentao.html.php
@@ -0,0 +1,165 @@
+
+ * @package convert
+ * @link https://www.zentao.net
+ */
+namespace zin;
+
+$items = array();
+foreach($lang->convert->jira->steps as $key => $label)
+{
+ $items[] = (object)array('text' => $label, 'active' => $key == $step);
+}
+
+div
+(
+ setClass('main-header relative center size-lg mx-auto my-4'),
+ setStyle(array('max-width' => 'var(--zt-page-form-max-width)')),
+ div
+ (
+ setClass('absolute left-0'),
+ $lang->convert->jira->mapJira2Zentao
+ ),
+ navigator
+ (
+ set::items($items)
+ ),
+);
+
+$buildHeader = function(string $label, int $count = 2): h
+{
+ return div
+ (
+ setClass("flex justify-center text-md font-bold w-1/{$count}"),
+ $label
+ );
+};
+
+$buildJira = function(string $name, int $count, string $label, int $value): h
+{
+ return div
+ (
+ setClass("flex justify-center w-1/{$count}"),
+ $label,
+ input
+ (
+ set::type('hidden'),
+ set::name("{$name}[]"),
+ set::value($value)
+ )
+ );
+};
+
+$buildZenTao = function(string $name, int $count, array $items): h
+{
+ return div
+ (
+ setClass("ml-4 w-1/{$count}"),
+ picker
+ (
+ set::name("{$name}[]"),
+ set::items($items)
+ )
+ );
+};
+
+$rows = array();
+if($step == 1)
+{
+ $rows[] = formRow
+ (
+ $buildHeader($lang->convert->jira->jiraObject),
+ $buildHeader($lang->convert->jira->zentaoObject)
+ );
+ foreach($issueTypeList as $id => $issueType)
+ {
+ $value = $method == 'db' ? $issueType->pname : $issueType['name'];
+
+ $rows[] = formRow
+ (
+ $buildJira('jiraObject', 2, $value, $id),
+ $buildZenTao('zentaoObject', 2, $lang->convert->jira->zentaoObjectList)
+ );
+ }
+}
+
+if($step == 2)
+{
+ $rows[] = formRow
+ (
+ $buildHeader($lang->convert->jira->jiraLinkType),
+ $buildHeader($lang->convert->jira->zentaoLinkType)
+ );
+ foreach($linkTypeList as $id => $linkType)
+ {
+ $value = $method == 'db' ? $linkType->linkname : $linkType['linkname'];
+
+ $rows[] = formRow
+ (
+ $buildJira('jiraLinkType', 2, $value, $id),
+ $buildZenTao('zentaoLinkType', 2, $lang->convert->jira->zentaoLinkTypeList)
+ );
+ }
+}
+
+if($step == 3)
+{
+ $rows[] = formRow
+ (
+ $buildHeader($lang->convert->jira->jiraResolution, 3),
+ $buildHeader($lang->convert->jira->zentaoResolution, 3),
+ $buildHeader($lang->convert->jira->zentaoReason, 3)
+ );
+ foreach($resolutionList as $id => $resolution)
+ {
+ $value = $method == 'db' ? $resolution->pname : $resolution['name'];
+
+ $rows[] = formRow
+ (
+ $buildJira('jiraResolution', 3, $value, $id),
+ $buildZenTao('zentaoResolution', 3, $lang->bug->resolutionList),
+ $buildZenTao('zentaoReason', 3, $lang->story->reasonList)
+ );
+ }
+}
+
+if($step == 4)
+{
+ $rows[] = formRow
+ (
+ $buildHeader($lang->convert->jira->jiraStatus, 5),
+ $buildHeader($lang->convert->jira->storyStatus, 5),
+ $buildHeader($lang->convert->jira->storyStage, 5),
+ $buildHeader($lang->convert->jira->taskStatus, 5),
+ $buildHeader($lang->convert->jira->bugStatus, 5)
+ );
+ foreach($statusList as $id => $status)
+ {
+ $value = $method == 'db' ? $status->pname : $status['name'];
+
+ $rows[] = formRow
+ (
+ $buildJira('jiraStatus', 5, $value, $id),
+ $buildZenTao('storyStatus', 5, $lang->story->statusList),
+ $buildZenTao('storyStage', 5, $lang->story->stageList),
+ $buildZenTao('taskStatus', 5, $lang->task->statusList),
+ $buildZenTao('bugStatus', 5, $lang->bug->statusList)
+ );
+ }
+}
+
+$backUrl = $step == 1 ? inlink('importNotice', "method={$method}") : inlink('mapJira2Zentao', "method={$method}&dbName={$dbName}&step=" . --$step);
+
+formPanel
+(
+ set::submitBtnText($lang->convert->jira->next),
+ set::backUrl($backUrl),
+ $rows
+);
+
+render();