diff --git a/muttdown/main.py b/muttdown/main.py
index d9c551f..0816c28 100644
--- a/muttdown/main.py
+++ b/muttdown/main.py
@@ -59,7 +59,7 @@ def _move_headers(source, dest):
             del source[k]
 
 
-def convert_tree(message, config, indent=0):
+def convert_tree(message, config, indent=0, wrap_alternative=True):
     """Recursively convert a potentially-multipart tree.
 
     Returns a tuple of (the converted tree, whether any markdown was found)
@@ -73,19 +73,32 @@ def convert_tree(message, config, indent=0):
         if disposition == 'inline' and ct in ('text/plain', 'text/markdown'):
             converted = convert_one(message, config)
         if converted is not None:
-            new_tree = MIMEMultipart('alternative')
-            _move_headers(message, new_tree)
-            new_tree.attach(message)
-            new_tree.attach(converted)
-            return new_tree, True
+            if wrap_alternative:
+                new_tree = MIMEMultipart('alternative')
+                _move_headers(message, new_tree)
+                new_tree.attach(message)
+                new_tree.attach(converted)
+                return new_tree, True
+            else:
+                return converted, True
         return message, False
     else:
         if ct == 'multipart/signed':
             # if this is a multipart/signed message, then let's just
             # recurse into the non-signature part
+            new_root = MIMEMultipart('alternative')
+            if message.preamble:
+                new_root.preamble = message.preamble
+            _move_headers(message, new_root)
+            converted = None
             for part in message.get_payload():
                 if part.get_content_type() != 'application/pgp-signature':
-                    return convert_tree(part, config, indent=indent + 1)
+                    converted, did_conversion = convert_tree(part, config, indent=indent + 1,
+                                                             wrap_alternative=False)
+                    if did_conversion:
+                        new_root.attach(converted)
+            new_root.attach(message)
+            return new_root, did_conversion
         else:
             did_conversion = False
             new_root = MIMEMultipart(cs, message.get_charset())

diff --git a/requirements-tests.txt b/requirements-tests.txt
index 2dab085..e2da4c8 100644
--- a/requirements-tests.txt
+++ b/requirements-tests.txt
@@ -1,2 +1,2 @@
-pytest>=3.0,<4.0
-pytest-cov>=2.0,<3.0
+pytest==3.10.*
+pytest-cov==2.6.*
diff --git a/tests/test_basic.py b/tests/test_basic.py
index 1eb2df9..e86bf31 100644
--- a/tests/test_basic.py
+++ b/tests/test_basic.py
@@ -1,5 +1,6 @@
 from email.mime.text import MIMEText
 from email.mime.multipart import MIMEMultipart
+from email.mime.application import MIMEApplication
 from email.message import Message
 import tempfile
 import shutil
@@ -100,3 +101,37 @@ def test_with_css(config_with_css):
     assert text_part.get_payload(decode=True) == b'!m\n\nThis is a message'
     html_part = converted.get_payload()[1]
     assert html_part.get_payload(decode=True) == b'<p style="font-family: serif">This is a message</p>'
+
+
+def test_headers_when_multipart_signed(basic_config):
+    msg = MIMEMultipart('signed')
+    msg['Subject'] = 'Test Message'
+    msg['From'] = 'from@example.com'
+    msg['To'] = 'to@example.com'
+    msg['Bcc'] = 'bananas'
+    msg.preamble = 'Outer preamble'
+
+    msg.attach(MIMEText("!m This is the main message body"))
+    msg.attach(MIMEApplication('signature here', 'pgp-signature', name='signature.asc'))
+
+    converted, _ = convert_tree(msg, basic_config)
+
+    assert converted['Subject'] == 'Test Message'
+    assert converted['From'] == 'from@example.com'
+    assert converted['To'] == 'to@example.com'
+
+    assert isinstance(converted, MIMEMultipart)
+    assert converted.preamble == 'Outer preamble'
+    assert len(converted.get_payload()) == 2
+    assert converted.get_content_type() == 'multipart/alternative'
+    html_part = converted.get_payload()[0]
+    original_signed_part = converted.get_payload()[1]
+    assert isinstance(html_part, MIMEText)
+    assert html_part.get_content_type() == 'text/html'
+    assert isinstance(original_signed_part, MIMEMultipart)
+    assert original_signed_part.get_content_type() == 'multipart/signed'
+    assert original_signed_part['Subject'] is None
+    text_part = original_signed_part.get_payload()[0]
+    signature_part = original_signed_part.get_payload()[1]
+    assert text_part.get_content_type() == 'text/plain'
+    assert signature_part.get_content_type() == 'application/pgp-signature'

Most header information seems to be going missing somewhere
Hello, I don't send a huge amount of email from Mutt so I'm not sure how long this has been going on, but I've recently realised that when I send emails, almost all the header information appears to get discarded. At the receiving end I can't see the "Subject", or the full "From" name (just the raw email address is shown there). Emails sent via Muttdown also don't appear to be including my PGP electronic signature. Interestingly, the email in my "Sent items" looks exactly as it should and includes the PGP signature.

If I take Muttdown out of the picture, everything seems to be working fine.

I'm running Neomutt 20180716.
tests/test_basic.py::test_headers_when_multipart_signed
tests/test_basic.py::test_unmodified_no_match tests/test_basic.py::test_simple_message tests/test_basic.py::test_with_css