Started stubbing stuff out, including a simple test, now is the part where we
write some actual cryptographic software. So yeah.
diff --git a/cryptography/primitives/__init__.py b/cryptography/primitives/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cryptography/primitives/__init__.py
diff --git a/cryptography/primitives/block/__init__.py b/cryptography/primitives/block/__init__.py
new file mode 100644
index 0000000..e49fcf3
--- /dev/null
+++ b/cryptography/primitives/block/__init__.py
@@ -0,0 +1,6 @@
+from cryptography.primitives.block.base import BlockCipher
+
+
+__all__ = [
+    "BlockCipher",
+]
diff --git a/cryptography/primitives/block/base.py b/cryptography/primitives/block/base.py
new file mode 100644
index 0000000..c2cc432
--- /dev/null
+++ b/cryptography/primitives/block/base.py
@@ -0,0 +1,8 @@
+class BlockCipher(object):
+    def __init__(self, cipher, mode):
+        super(BlockCipher, self).__init__()
+        self.cipher = cipher
+        self.mode = mode
+
+    def encrypt(self, plaintext):
+        raise NotImplementedError
diff --git a/cryptography/primitives/block/ciphers.py b/cryptography/primitives/block/ciphers.py
new file mode 100644
index 0000000..e4e570d
--- /dev/null
+++ b/cryptography/primitives/block/ciphers.py
@@ -0,0 +1,4 @@
+class AES(object):
+    def __init__(self, key):
+        super(AES, self).__init__()
+        self.key = key
diff --git a/cryptography/primitives/block/modes.py b/cryptography/primitives/block/modes.py
new file mode 100644
index 0000000..d336ed3
--- /dev/null
+++ b/cryptography/primitives/block/modes.py
@@ -0,0 +1,5 @@
+class CBC(object):
+    def __init__(self, initialization_vector, padding):
+        super(CBC, self).__init__()
+        self.initialization_vector = initialization_vector
+        self.padding = padding
diff --git a/cryptography/primitives/block/padding.py b/cryptography/primitives/block/padding.py
new file mode 100644
index 0000000..6708349
--- /dev/null
+++ b/cryptography/primitives/block/padding.py
@@ -0,0 +1,2 @@
+class NoPadding(object):
+    pass
diff --git a/docs/primitives/symmetric-encryption.rst b/docs/primitives/symmetric-encryption.rst
index fe074f3..29eb282 100644
--- a/docs/primitives/symmetric-encryption.rst
+++ b/docs/primitives/symmetric-encryption.rst
@@ -12,7 +12,7 @@
 
     .. code-block:: pycon
 
-        >>> from cryptography.primitives.block import BlockCipher, cipher, mode, padding
+        >>> from cryptography.primitives.block import BlockCipher, ciphers, modes, padding
         >>> cipher = BlockCipher(cipher.AES(key), mode.CBC(iv, padding.PKCS7()))
         >>> cipher.encrypt("my secret message") + cipher.finalize()
         # The ciphertext
@@ -36,7 +36,7 @@
 Ciphers
 ~~~~~~~
 
-.. class:: cryptography.primitives.block.cipher.AES(key)
+.. class:: cryptography.primitives.block.ciphers.AES(key)
 
     AES (Advanced Encryption Standard) is a block cipher standardized by NIST.
     AES is both fast, and cryptographically strong. It is a good default
@@ -49,7 +49,7 @@
 Modes
 ~~~~~
 
-.. class:: cryptography.primitives.block.mode.CBC(initialization_vector, padding)
+.. class:: cryptography.primitives.block.modes.CBC(initialization_vector, padding)
 
     CBC (Cipher block chaining) is a mode of operation for block ciphers. It is
     considered cryptographically strong.
diff --git a/tests/primitives/test_block.py b/tests/primitives/test_block.py
new file mode 100644
index 0000000..e22d05e
--- /dev/null
+++ b/tests/primitives/test_block.py
@@ -0,0 +1,23 @@
+import binascii
+
+import pytest
+
+from cryptography.primitives.block import BlockCipher, ciphers, modes, padding
+
+
+class TestBlockCipher(object):
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"), [
+        (
+            b"9dc2c84a37850c11699818605f47958c",
+            b"256953b2feab2a04ae0180d8335bbed6",
+            b"2e586692e647f5028ec6fa47a55a2aab",
+            b"1b1ebd1fc45ec43037fd4844241a437f"
+        ),
+    ])
+    def test_aes_cbc_nopadding(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext