diff --git a/src/front/src/app/upsertproject/upsertproject.controller.js b/src/front/src/app/upsertproject/upsertproject.controller.js
index d145dd6..c60c48a 100644
--- a/src/front/src/app/upsertproject/upsertproject.controller.js
+++ b/src/front/src/app/upsertproject/upsertproject.controller.js
@@ -30,6 +30,7 @@ angular.module('topcoderX').controller('ProjectController', ['currentUser', '$sc
     if ($rootScope.project) {
       $scope.title = 'Manage a Project';
       $scope.project = $rootScope.project;
+      $scope.project.tags = $rootScope.project.tags.split(',');
       $scope.project.repoUrl = $rootScope.project.repoUrls.join(',');
       $scope.editing = true;
       if ($rootScope.project.tcDirectId) {
@@ -52,7 +53,8 @@ angular.module('topcoderX').controller('ProjectController', ['currentUser', '$sc
     $scope.tags = [];
     $scope.fetchTags = function() {
       ProjectService.getTags().then(function (resp) {
-        $scope.tags = resp.data.map(tag => tag.name);
+        const s = new Set(resp.data.result.content.map(function(tag) { return tag.name; }));
+        $scope.tags = Array.from(s).sort();
       });
     }
     $scope.fetchTags();
diff --git a/src/models/Project.js b/src/models/Project.js
index 06f1608..5b4440b 100644
--- a/src/models/Project.js
+++ b/src/models/Project.js
@@ -25,9 +25,9 @@ const schema = new Schema({
     required: true
   },
   tags: {
-    type: Array,
+    type: String,
     required: true,
-    default: []
+    default: ''
   },
   rocketChatWebhook: {type: String, required: false},
   rocketChatChannelName: {type: String, required: false},
diff --git a/src/services/ProjectService.js b/src/services/ProjectService.js
index fcfc7b3..d8b57f4 100644
--- a/src/services/ProjectService.js
+++ b/src/services/ProjectService.js
@@ -212,6 +212,7 @@ async function create(project, currentUser) {
   project.secretWebhookKey = guid.raw();
   project.copilot = project.copilot ? project.copilot.toLowerCase() : null;
   project.id = helper.generateIdentifier();
+  project.tags = project.tags.join(',');
 
   const createdProject = await dbHelper.create(models.Project, project);
 
@@ -221,7 +222,7 @@ async function create(project, currentUser) {
     try {
       const challengeUUIDs = await _createOrMigrateRepository(repoUrl, project, currentUser);
       if (!_.isEmpty(challengeUUIDs)) {
-        challengeUUIDsList.append(challengeUUIDs);
+        challengeUUIDsList.push(challengeUUIDs);
       }
     }
     catch (err) {
@@ -278,6 +279,7 @@ async function update(project, currentUser) {
      */
   project.owner = dbProject.owner;
   project.copilot = project.copilot !== undefined ? project.copilot.toLowerCase() : null;
+  project.tags = project.tags.join(',');
 
   // TODO: move the following logic into one dynamoose transaction
   const repos = await dbHelper.queryRepositoriesByProjectId(project.id);
@@ -289,13 +291,13 @@ async function update(project, currentUser) {
       await dbHelper.update(models.Repository, repoId, {archived: project.archived});
       if (!_.isEqual(dbProject.tags, project.tags)) {
         // NOTE: delay query of challengeUUIDs into topcoder-x-processor
-        challengeUUIDsList.append(repoUrl);
+        challengeUUIDsList.push(repoUrl);
       }
     } else {
       try {
         const challengeUUIDs = await _createOrMigrateRepository(repoUrl, project, currentUser);
         if (!_.isEmpty(challengeUUIDs)) {
-          challengeUUIDsList.append(challengeUUIDs);
+          challengeUUIDsList.push(challengeUUIDs);
         }
       }
       catch (err) {