diff --git a/src/main/csharp/QueueBrowser.cs b/src/main/csharp/QueueBrowser.cs
new file mode 100644
index 0000000..32752c5
--- /dev/null
+++ b/src/main/csharp/QueueBrowser.cs
@@ -0,0 +1,141 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+using System;
+using System.Collections;
+using System.Messaging;
+using Apache.NMS;
+using Apache.NMS.Util;
+
+namespace Apache.NMS.MSMQ
+{
+	public class QueueBrowser : Apache.NMS.IQueueBrowser
+	{
+		private bool closed = false;
+		private bool disposed = false;
+
+        private readonly Session session;
+        private MessageQueue messageQueue;
+
+		public QueueBrowser(Session session, MessageQueue messageQueue)
+		{
+            this.session = session;
+            this.messageQueue = messageQueue;
+            if(null != this.messageQueue)
+            {
+                this.messageQueue.MessageReadPropertyFilter.SetAll();
+            }
+
+		}
+
+		~QueueBrowser()
+		{
+			Dispose(false);
+		}
+
+		#region IDisposable Members
+
+		///<summary>
+		/// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
+		///</summary>
+		public void Dispose()
+		{
+			Dispose(true);
+			GC.SuppressFinalize(this);
+		}
+
+		protected void Dispose(bool disposing)
+		{
+			if(disposed)
+			{
+				return;
+			}
+
+			if(disposing)
+			{
+				// Dispose managed code here.
+			}
+
+			try
+			{
+				Close();
+			}
+			catch
+			{
+				// Ignore errors.
+			}
+
+			disposed = true;
+		}
+
+		#endregion
+
+		public void  Close()
+		{
+            if(messageQueue != null)
+            {
+                messageQueue.Dispose();
+                messageQueue = null;
+            }
+			closed = true;
+		}
+
+		public string MessageSelector
+		{
+			get { throw new NotSupportedException(); }
+		}
+
+		public IQueue Queue
+		{
+			get { return new Queue(this.messageQueue.Path); }
+		}
+
+		internal class Enumerator : IEnumerator
+		{
+			private readonly Session session;
+			private readonly MessageEnumerator innerEnumerator;
+
+			public Enumerator(Session session, MessageQueue messageQueue)
+			{
+				this.session = session;
+				this.innerEnumerator = messageQueue.GetMessageEnumerator2();
+			}
+
+			public object Current
+			{
+				get
+				{
+					return this.session.MessageConverter.ToNmsMessage(this.innerEnumerator.Current);
+				}
+			}
+
+			public bool MoveNext()
+			{
+				return this.innerEnumerator.MoveNext();
+			}
+
+			public void Reset()
+			{
+				this.innerEnumerator.Reset();
+			}
+		}
+
+		public IEnumerator GetEnumerator()
+		{
+			return new Enumerator(this.session, this.messageQueue);
+		}
+	}
+}
diff --git a/src/main/csharp/Session.cs b/src/main/csharp/Session.cs
index 9ce99f6..5172c08 100644
--- a/src/main/csharp/Session.cs
+++ b/src/main/csharp/Session.cs
@@ -90,12 +90,17 @@
 
         public IQueueBrowser CreateBrowser(IQueue queue)
         {
-            throw new NotImplementedException();
+            return CreateBrowser(queue, null);
         }
 
         public IQueueBrowser CreateBrowser(IQueue queue, string selector)
         {
-            throw new NotImplementedException();
+            if(selector != null)
+            {
+                throw new NotSupportedException("Selectors are not supported by MSMQ");
+            }
+            MessageQueue msmqQueue = MessageConverter.ToMsmqDestination(queue);
+            return new QueueBrowser(this, msmqQueue);
         }
 
         public IQueue GetQueue(string name)
@@ -110,12 +115,12 @@
 
         public ITemporaryQueue CreateTemporaryQueue()
         {
-            throw new NotSupportedException("Tempoary Queues are not supported by MSMQ");
+            throw new NotSupportedException("Temporary Queues are not supported by MSMQ");
         }
 
         public ITemporaryTopic CreateTemporaryTopic()
         {
-            throw new NotSupportedException("Tempoary Topics are not supported by MSMQ");
+            throw new NotSupportedException("Temporary Topics are not supported by MSMQ");
         }
 
         /// <summary>
@@ -123,8 +128,7 @@
         /// </summary>
         public void DeleteDestination(IDestination destination)
         {
-            // TODO: Implement if possible.  If not possible, then change exception to NotSupportedException().
-            throw new NotImplementedException();
+            MessageQueue.Delete(destination.ToString());
         }
 
         public IMessage CreateMessage()
diff --git a/vs2008-msmq.csproj b/vs2008-msmq.csproj
index 6221c67..8a20d12 100644
--- a/vs2008-msmq.csproj
+++ b/vs2008-msmq.csproj
@@ -80,6 +80,7 @@
     <Compile Include="src\main\csharp\MessageProducer.cs" />
     <Compile Include="src\main\csharp\ObjectMessage.cs" />
     <Compile Include="src\main\csharp\Queue.cs" />
+    <Compile Include="src\main\csharp\QueueBrowser.cs" />
     <Compile Include="src\main\csharp\Session.cs" />
     <Compile Include="src\main\csharp\StreamMessage.cs" />
     <Compile Include="src\main\csharp\TextMessage.cs" />
