     success: (client, callback)->
       {delegate} = client.connection
 
-      deleteTag = (err) =>
-        tagId = @getId()
-        @update {$set: status: "deleted"}, (err)=>
-          return callback err if err
-          @constructor.emit 'TagIsDeleted', {tagId}
-          callback null
-
-      unless delegate.checkFlag('super-admin')
-        callback new KodingError 'Access denied'
-      else
-        if @status is 'deleted'
-          return callback new KodingError "Topic is already deleted!"
-
-        if @status is 'synonym'
-          return Relationship.remove {sourceId: @getId(), as: "synonymOf"}, deleteTag
-        deleteTag null
+      return callback new KodingError 'Access denied' unless delegate.checkFlag('super-admin')
+
+      return callback new KodingError "Topic is already deleted!" if @status is 'deleted'
+
+      if @status is 'synonym'
+        @delete_ => Relationship.remove {sourceId: @getId(), as: "synonymOf"}, callback
+
+      # check child topics and delete all
+      Relationship.all "targetId": @getId(), "as": "synonymOf", (err, childTopicRels) =>
+        return callback err if err
+        unless childTopicRels?.length then @delete_ callback
+        else
+          queue = childTopicRels.map (childTopicRel) ->
+            -> JTag.one "_id": childTopicRel.sourceId, (err, childTopic) ->
+              return callback err if err
+              return callback new KodingError 'Child Topic could not be found' unless childTopic
+              childTopic.delete_ (err) ->
+                return callback err if err
+                Relationship.remove {sourceId: childTopic.getId(), as: "synonymOf"}, -> queue.fin()
+          dash queue, => @delete_ callback
 
 
   @fetchSkillTags:(selector, options, callback)->

      if @status in ['deleted', 'synonym']
        return callback new KodingError "Topic is already set as #{@status}!"

      @checkChildTopics (err) =>
        return callback err if err
        {delegate} = client.connection
        {group} = client.context


            return callback new KodingError "##{tag.title} already set as #{tag.status}!"
          else
            addSynonym tag

  @findSuggestions = (client, seed, options, callback)->
    {limit, blacklist, skip, category} = options
