split Name from x509 module
diff --git a/src/cryptography/x509/__init__.py b/src/cryptography/x509/__init__.py
index 1283867..45923b3 100644
--- a/src/cryptography/x509/__init__.py
+++ b/src/cryptography/x509/__init__.py
@@ -12,7 +12,7 @@
     DistributionPoint, DuplicateExtension, ExtendedKeyUsage,
     Extension, ExtensionNotFound, ExtensionType, Extensions, GeneralName,
     GeneralNames, IPAddress, InhibitAnyPolicy, InvalidVersion,
-    IssuerAlternativeName, KeyUsage, Name, NameAttribute, NameConstraints,
+    IssuerAlternativeName, KeyUsage, NameConstraints,
     NoticeReference, OCSPNoCheck, ObjectIdentifier, OtherName,
     PolicyInformation, RFC822Name, ReasonFlags, RegisteredID,
     RevokedCertificate, SubjectAlternativeName, SubjectKeyIdentifier,
@@ -21,6 +21,7 @@
     load_der_x509_certificate,
     load_der_x509_csr, load_pem_x509_certificate, load_pem_x509_csr,
 )
+from cryptography.x509.name import Name, NameAttribute
 from cryptography.x509.oid import (
     OID_ANY_POLICY, OID_AUTHORITY_INFORMATION_ACCESS,
     OID_AUTHORITY_KEY_IDENTIFIER, OID_BASIC_CONSTRAINTS, OID_CA_ISSUERS,
diff --git a/src/cryptography/x509/base.py b/src/cryptography/x509/base.py
index 6fdc0f5..29e6e87 100644
--- a/src/cryptography/x509/base.py
+++ b/src/cryptography/x509/base.py
@@ -23,6 +23,7 @@
 from cryptography import utils
 from cryptography.hazmat.primitives import serialization
 from cryptography.hazmat.primitives.asymmetric import dsa, ec, rsa
+from cryptography.x509.name import Name
 from cryptography.x509.oid import (
     OID_AUTHORITY_INFORMATION_ACCESS,
     OID_AUTHORITY_KEY_IDENTIFIER, OID_BASIC_CONSTRAINTS,
@@ -128,66 +129,6 @@
         self.type = type
 
 
-class NameAttribute(object):
-    def __init__(self, oid, value):
-        if not isinstance(oid, ObjectIdentifier):
-            raise TypeError(
-                "oid argument must be an ObjectIdentifier instance."
-            )
-
-        if not isinstance(value, six.text_type):
-            raise TypeError(
-                "value argument must be a text type."
-            )
-
-        self._oid = oid
-        self._value = value
-
-    oid = utils.read_only_property("_oid")
-    value = utils.read_only_property("_value")
-
-    def __eq__(self, other):
-        if not isinstance(other, NameAttribute):
-            return NotImplemented
-
-        return (
-            self.oid == other.oid and
-            self.value == other.value
-        )
-
-    def __ne__(self, other):
-        return not self == other
-
-    def __repr__(self):
-        return "<NameAttribute(oid={0.oid}, value={0.value!r})>".format(self)
-
-
-class Name(object):
-    def __init__(self, attributes):
-        self._attributes = attributes
-
-    def get_attributes_for_oid(self, oid):
-        return [i for i in self if i.oid == oid]
-
-    def __eq__(self, other):
-        if not isinstance(other, Name):
-            return NotImplemented
-
-        return self._attributes == other._attributes
-
-    def __ne__(self, other):
-        return not self == other
-
-    def __iter__(self):
-        return iter(self._attributes)
-
-    def __len__(self):
-        return len(self._attributes)
-
-    def __repr__(self):
-        return "<Name({0!r})>".format(self._attributes)
-
-
 class Extensions(object):
     def __init__(self, extensions):
         self._extensions = extensions
diff --git a/src/cryptography/x509/name.py b/src/cryptography/x509/name.py
new file mode 100644
index 0000000..992786e
--- /dev/null
+++ b/src/cryptography/x509/name.py
@@ -0,0 +1,70 @@
+# This file is dual licensed under the terms of the Apache License, Version
+# 2.0, and the BSD License. See the LICENSE file in the root of this repository
+# for complete details.
+
+from __future__ import absolute_import, division, print_function
+
+import six
+
+from cryptography import utils
+from cryptography.x509.oid import ObjectIdentifier
+
+
+class NameAttribute(object):
+    def __init__(self, oid, value):
+        if not isinstance(oid, ObjectIdentifier):
+            raise TypeError(
+                "oid argument must be an ObjectIdentifier instance."
+            )
+
+        if not isinstance(value, six.text_type):
+            raise TypeError(
+                "value argument must be a text type."
+            )
+
+        self._oid = oid
+        self._value = value
+
+    oid = utils.read_only_property("_oid")
+    value = utils.read_only_property("_value")
+
+    def __eq__(self, other):
+        if not isinstance(other, NameAttribute):
+            return NotImplemented
+
+        return (
+            self.oid == other.oid and
+            self.value == other.value
+        )
+
+    def __ne__(self, other):
+        return not self == other
+
+    def __repr__(self):
+        return "<NameAttribute(oid={0.oid}, value={0.value!r})>".format(self)
+
+
+class Name(object):
+    def __init__(self, attributes):
+        self._attributes = attributes
+
+    def get_attributes_for_oid(self, oid):
+        return [i for i in self if i.oid == oid]
+
+    def __eq__(self, other):
+        if not isinstance(other, Name):
+            return NotImplemented
+
+        return self._attributes == other._attributes
+
+    def __ne__(self, other):
+        return not self == other
+
+    def __iter__(self):
+        return iter(self._attributes)
+
+    def __len__(self):
+        return len(self._attributes)
+
+    def __repr__(self):
+        return "<Name({0!r})>".format(self._attributes)