diff --git a/src/ProtocolBuffersLite.Test/AbstractMessageLiteTest.cs b/src/ProtocolBuffersLite.Test/AbstractMessageLiteTest.cs
index 0391308..5ef9636 100644
--- a/src/ProtocolBuffersLite.Test/AbstractMessageLiteTest.cs
+++ b/src/ProtocolBuffersLite.Test/AbstractMessageLiteTest.cs
@@ -1,4 +1,5 @@
-﻿#region Copyright notice and license
+#region Copyright notice and license
+
 // Protocol Buffers - Google's data interchange format
 // Copyright 2008 Google Inc.  All rights reserved.
 // http://github.com/jskeet/dotnet-protobufs/
@@ -30,6 +31,7 @@
 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
 #endregion
 
 using System;
@@ -39,88 +41,96 @@
 using Google.ProtocolBuffers.TestProtos;
 using NUnit.Framework;
 
-namespace Google.ProtocolBuffers {
-  [TestFixture]
-  public class AbstractMessageLiteTest {
+namespace Google.ProtocolBuffers
+{
+    [TestFixture]
+    public class AbstractMessageLiteTest
+    {
+        [Test]
+        public void TestMessageLiteToByteString()
+        {
+            TestRequiredLite msg = TestRequiredLite.CreateBuilder()
+                .SetD(42)
+                .SetEn(ExtraEnum.EXLITE_BAZ)
+                .Build();
 
-    [Test]
-    public void TestMessageLiteToByteString() {
-      TestRequiredLite msg = TestRequiredLite.CreateBuilder()
-        .SetD(42)
-        .SetEn(ExtraEnum.EXLITE_BAZ)
-        .Build();
-      
-      ByteString b = msg.ToByteString();
-      Assert.AreEqual(4, b.Length);
-      Assert.AreEqual(TestRequiredLite.DFieldNumber << 3, b[0]);
-      Assert.AreEqual(42, b[1]);
-      Assert.AreEqual(TestRequiredLite.EnFieldNumber << 3, b[2]);
-      Assert.AreEqual((int)ExtraEnum.EXLITE_BAZ, b[3]);
+            ByteString b = msg.ToByteString();
+            Assert.AreEqual(4, b.Length);
+            Assert.AreEqual(TestRequiredLite.DFieldNumber << 3, b[0]);
+            Assert.AreEqual(42, b[1]);
+            Assert.AreEqual(TestRequiredLite.EnFieldNumber << 3, b[2]);
+            Assert.AreEqual((int) ExtraEnum.EXLITE_BAZ, b[3]);
+        }
+
+        [Test]
+        public void TestMessageLiteToByteArray()
+        {
+            TestRequiredLite msg = TestRequiredLite.CreateBuilder()
+                .SetD(42)
+                .SetEn(ExtraEnum.EXLITE_BAZ)
+                .Build();
+
+            ByteString b = msg.ToByteString();
+            ByteString copy = ByteString.CopyFrom(msg.ToByteArray());
+            Assert.AreEqual(b, copy);
+        }
+
+        [Test]
+        public void TestMessageLiteWriteTo()
+        {
+            TestRequiredLite msg = TestRequiredLite.CreateBuilder()
+                .SetD(42)
+                .SetEn(ExtraEnum.EXLITE_BAZ)
+                .Build();
+
+            MemoryStream ms = new MemoryStream();
+            msg.WriteTo(ms);
+            Assert.AreEqual(msg.ToByteArray(), ms.ToArray());
+        }
+
+        [Test]
+        public void TestMessageLiteWriteDelimitedTo()
+        {
+            TestRequiredLite msg = TestRequiredLite.CreateBuilder()
+                .SetD(42)
+                .SetEn(ExtraEnum.EXLITE_BAZ)
+                .Build();
+
+            MemoryStream ms = new MemoryStream();
+            msg.WriteDelimitedTo(ms);
+            byte[] buffer = ms.ToArray();
+
+            Assert.AreEqual(5, buffer.Length);
+            Assert.AreEqual(4, buffer[0]);
+            byte[] msgBytes = new byte[4];
+            Array.Copy(buffer, 1, msgBytes, 0, 4);
+            Assert.AreEqual(msg.ToByteArray(), msgBytes);
+        }
+
+        [Test]
+        public void TestIMessageLiteWeakCreateBuilderForType()
+        {
+            IMessageLite msg = TestRequiredLite.DefaultInstance;
+            Assert.AreEqual(typeof (TestRequiredLite.Builder), msg.WeakCreateBuilderForType().GetType());
+        }
+
+        [Test]
+        public void TestMessageLiteWeakToBuilder()
+        {
+            IMessageLite msg = TestRequiredLite.CreateBuilder()
+                .SetD(42)
+                .SetEn(ExtraEnum.EXLITE_BAZ)
+                .Build();
+
+            IMessageLite copy = msg.WeakToBuilder().WeakBuild();
+            Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
+        }
+
+        [Test]
+        public void TestMessageLiteWeakDefaultInstanceForType()
+        {
+            IMessageLite msg = TestRequiredLite.DefaultInstance;
+            Assert.IsTrue(Object.ReferenceEquals(TestRequiredLite.DefaultInstance, msg.WeakDefaultInstanceForType));
+        }
     }
-
-    [Test]
-    public void TestMessageLiteToByteArray() {
-      TestRequiredLite msg = TestRequiredLite.CreateBuilder()
-        .SetD(42)
-        .SetEn(ExtraEnum.EXLITE_BAZ)
-        .Build();
-
-      ByteString b = msg.ToByteString();
-      ByteString copy = ByteString.CopyFrom(msg.ToByteArray());
-      Assert.AreEqual(b, copy);
-    }
-
-    [Test]
-    public void TestMessageLiteWriteTo() {
-      TestRequiredLite msg = TestRequiredLite.CreateBuilder()
-        .SetD(42)
-        .SetEn(ExtraEnum.EXLITE_BAZ)
-        .Build();
-
-      MemoryStream ms = new MemoryStream();
-      msg.WriteTo(ms);
-      Assert.AreEqual(msg.ToByteArray(), ms.ToArray());
-    }
-
-    [Test]
-    public void TestMessageLiteWriteDelimitedTo() {
-      TestRequiredLite msg = TestRequiredLite.CreateBuilder()
-        .SetD(42)
-        .SetEn(ExtraEnum.EXLITE_BAZ)
-        .Build();
-
-      MemoryStream ms = new MemoryStream();
-      msg.WriteDelimitedTo(ms);
-      byte[] buffer = ms.ToArray();
-
-      Assert.AreEqual(5, buffer.Length);
-      Assert.AreEqual(4, buffer[0]);
-      byte[] msgBytes = new byte[4];
-      Array.Copy(buffer, 1, msgBytes, 0, 4);
-      Assert.AreEqual(msg.ToByteArray(), msgBytes);
-    }
-
-    [Test]
-    public void TestIMessageLiteWeakCreateBuilderForType() {
-      IMessageLite msg = TestRequiredLite.DefaultInstance;
-      Assert.AreEqual(typeof(TestRequiredLite.Builder), msg.WeakCreateBuilderForType().GetType());
-    }
-
-    [Test]
-    public void TestMessageLiteWeakToBuilder() {
-      IMessageLite msg = TestRequiredLite.CreateBuilder()
-        .SetD(42)
-        .SetEn(ExtraEnum.EXLITE_BAZ)
-        .Build();
-
-      IMessageLite copy = msg.WeakToBuilder().WeakBuild();
-      Assert.AreEqual(msg.ToByteArray(), copy.ToByteArray());
-    }
-
-    [Test]
-    public void TestMessageLiteWeakDefaultInstanceForType() {
-      IMessageLite msg = TestRequiredLite.DefaultInstance;
-      Assert.IsTrue(Object.ReferenceEquals(TestRequiredLite.DefaultInstance, msg.WeakDefaultInstanceForType));
-    }
-  }
-}
+}
\ No newline at end of file
