diff --git a/src/hostinfo/named.py b/src/hostinfo/named.py
index 2d2e0a5973f3931ab345ff0c6543097fb28a3c43..428a5c4d5b3916ef15bb85627b67de8b49485617 100755
--- a/src/hostinfo/named.py
+++ b/src/hostinfo/named.py
@@ -6,6 +6,13 @@ import re
 import sys
 import os
 
+class NoNameserverException(Exception):
+    pass
+
+class InvalidHostnameException(Exception):
+    pass
+
+
 def generate(tree, options):
     #
     # A. Check if host is a nameserver
@@ -100,7 +107,7 @@ def header(tree, domain, origin=None):
 
     if not filter(lambda ns: ns.domain[0] == domain and ns.primary[0] == 'yes',
                   tree._host_._interface_._nameserver_):
-        raise Exception("No nameserver defined for %s" % domain)
+        raise NoNameserverException("No nameserver defined for %s" % domain)
     result = util.StringArray()
     if origin:
         result += "$ORIGIN %s." % origin
@@ -153,8 +160,8 @@ class DomainDict:
             pass
 
         def add_host(self, name, ttl, kind, value):
-            if not re.match('^[*0-9a-zA-Z][-.0-9a-zA-Z]*$', name):
-                raise Exception('Invalid host name "%s"' % name)
+            if not re.match('^([*0-9a-zA-Z][-.0-9a-zA-Z]*|@)$', name):
+                raise InvalidHostnameException('Invalid host name "%s"' % name)
             if not name in self.host:
                 self.host[name] = set()
                 pass
@@ -197,18 +204,6 @@ class DomainDict:
 def generate_forward(tree, hosts):
     def callback(domain):
         result = header(tree, domain, domain)
-        for name,address,ttl in hosts:
-            if name == '%s.' % (domain):
-                # Host with same name as domain goes into header
-                if address.version == 4:
-                    result += ('@      %-8s IN      A       %s' %
-                               (ttl, str(address.exploded)))
-                elif address.version == 6:
-                    result += ('@      %-8s IN      AAAA    %s' %
-                               (ttl, str(address.exploded)))
-                    pass
-                pass
-            pass
         for mx in [ m for m in tree._host_._interface_._mailhost_ 
                     if m.domain[0] == domain]:
             pri = int(mx.priority[0] or 0)
@@ -276,15 +271,15 @@ def generate_forward(tree, hosts):
                         for s in tree._subnet_ 
                         if s.domain[0] and util.network(s)]:
         for name,address,ttl in hosts:
-            try:
-                if name.endswith('.'):
-                    d = '.'.join(name.split('.')[1:-1])
-                    n = name.split('.')[0]
-                    add_host(d, n, ttl, address)
-                    continue
-            except Exception,e:
+            if name.endswith('.'):
+                if name[0:-1] == domain:
+                    add_host(domain, '@', ttl, address)
+                    pass
+                elif '.'.join(name.split('.')[1:-1]) == domain:
+                    add_host(domain,  name.split('.')[0], ttl, address)
+                    pass
                 pass
-            if address in net:
+            elif address in net:
                 add_host(domain, name, ttl, address)
                 pass
             pass