           create {title, group}, delegate, (err, tag) =>
             return callback err if err
             addSynonym tag
-        else if tag.status is 'synonym' #for preventing circular synonym definition
-          tag.fetchSynonym (err, synonym) =>
-            if String(synonym?.getId()) is String(@getId())
-              return callback new KodingError "Circular Synonym Definition!"
+        else if tag.status is "synonym" or tag.status is "deleted"
+          return callback new KodingError "##{tag.title} already set as #{tag.status}!"
+        else
+          @checkChildSynonyms (err) =>
+            return callback err if err
             addSynonym tag
-        else
-          addSynonym tag
+
+  checkChildSynonyms : (callback) =>
+    Relationship.one "targetId": @getId(), "as": "synonymOf", (err, childSynonym) =>
+      return callback err if err
+      if childSynonym
+        return callback new KodingError "##{@title} have child tags! You must first delete them"
+      callback null
+
 
   @findSuggestions = (client, seed, options, callback)->
     {limit, blacklist, skip, category} = options

          (signature Object, Function)
        removeTagFromStatus:
          (signature Object, Function)
        delete:
          (signature Function)
        fetchRandomFollowers:


  @create$ = permit 'create tags',
    success: (client, data, callback)->
      {connection:{delegate}} = client
      data.category = "user-tag"
      data.group = client.context.group
      create data, delegate, callback
