diff --git a/src/main/csharp/Connection.cs b/src/main/csharp/Connection.cs
index 0da6b86..a2e48dc 100755
--- a/src/main/csharp/Connection.cs
+++ b/src/main/csharp/Connection.cs
@@ -40,7 +40,6 @@
         private readonly object myLock = new object();
         private bool asyncSend = false;
         private bool alwaysSyncSend = false;
-        private bool asyncClose = true;
         private bool copyMessageOnSend = true;
         private bool connected = false;
         private bool closed = false;
@@ -100,18 +99,6 @@
         }
 
         /// <summary>
-        /// This property indicates whether or not async close is enabled.
-        /// When the connection is closed, it will either send a synchronous
-        /// DisposeOf command to the broker and wait for confirmation (if true),
-        /// or it will send the DisposeOf command asynchronously.
-        /// </summary>
-        public bool AsyncClose
-        {
-            get { return asyncClose; }
-            set { asyncClose = value; }
-        }
-
-        /// <summary>
         /// This property sets the acknowledgment mode for the connection.
         /// The URI parameter connection.ackmode can be set to a string value
         /// that maps to the enumeration value.
@@ -271,7 +258,6 @@
         public ISession CreateSession(AcknowledgementMode sessionAcknowledgementMode)
         {
             SessionInfo info = CreateSessionInfo(sessionAcknowledgementMode);
-            SyncRequest(info, this.RequestTimeout);
             Session session = new Session(this, info, sessionAcknowledgementMode);
 
             // Set properties on session using parameters prefixed with "session."
@@ -329,7 +315,6 @@
 
                     if(connected)
                     {
-                        DisposeOf(ConnectionId);
                         ShutdownInfo shutdowninfo = new ShutdownInfo();
                         transport.Oneway(shutdowninfo);
                     }
@@ -438,37 +423,6 @@
             }
         }
 
-        private void DisposeOf(DataStructure objectId)
-        {
-            try
-            {
-                RemoveInfo command = new RemoveInfo();
-                command.ObjectId = objectId;
-                if(asyncClose)
-                {
-                    Tracer.Info("Asynchronously disposing of Connection.");
-                    if(connected)
-                    {
-                        transport.Oneway(command);
-                    }
-                    Tracer.Info("Oneway command sent to broker.");
-                }
-                else
-                {
-                    // Ensure that the object is disposed to avoid potential race-conditions
-                    // of trying to re-create the same object in the broker faster than
-                    // the broker can dispose of the object.  Allow up to 5 seconds to process.
-                    Tracer.Info("Synchronously disposing of Connection.");
-                    SyncRequest(command, TimeSpan.FromSeconds(5));
-                    Tracer.Info("Synchronously closed Connection.");
-                }
-            }
-            catch // (BrokerException)
-            {
-                // Ignore exceptions while shutting down.
-            }
-        }
-
         protected void CheckConnected()
         {
             if(closed)
diff --git a/src/main/csharp/Protocol/StompWireFormat.cs b/src/main/csharp/Protocol/StompWireFormat.cs
index 1fa21a5..23cc708 100644
--- a/src/main/csharp/Protocol/StompWireFormat.cs
+++ b/src/main/csharp/Protocol/StompWireFormat.cs
@@ -31,7 +31,6 @@
     {
         private Encoding encoder = new UTF8Encoding();
         private ITransport transport;
-        private IDictionary consumers = Hashtable.Synchronized(new Hashtable());
 
         public StompWireFormat()
         {
@@ -301,9 +300,6 @@
                 frame.SetProperty("activemq.retroactive", command.Retroactive);
             }
 
-            // TODO - The Session should do this one.
-            consumers[command.ConsumerId] = command.ConsumerId;
-            
             frame.ToStream(dataOut);
         }
 
@@ -321,59 +317,6 @@
                 }                
                 frame.SetProperty("id", StompHelper.ToStomp(consumerId));
                 frame.ToStream(dataOut);
-                consumers.Remove(consumerId);
-            }
-            else if(id is SessionId)
-            {
-                // When a session is removed, it needs to remove it's consumers too.
-                // Find all the consumer that were part of the session.
-                SessionId sessionId = (SessionId) id;
-                ArrayList matches = new ArrayList();
-                foreach (DictionaryEntry entry in consumers)
-                {
-                    ConsumerId t = (ConsumerId) entry.Key;
-                    if( sessionId.ConnectionId==t.ConnectionId && sessionId.Value==t.SessionId )
-                    {
-                        matches.Add(t);
-                    }
-                }
-
-                bool unsubscribedConsumer = false;
-
-                // Un-subscribe them.
-                foreach(ConsumerId consumerId in matches)
-                {
-                    if(command.ResponseRequired)
-                    {
-                        frame.SetProperty("receipt", command.CommandId);
-                    }                
-                    frame.SetProperty("id", StompHelper.ToStomp(consumerId));
-                    frame.ToStream(dataOut);
-                    consumers.Remove(consumerId);
-                    unsubscribedConsumer = true;
-                }
-
-                if(!unsubscribedConsumer && command.ResponseRequired)
-                {
-                    if(command.ResponseRequired)
-                    {
-                        frame.SetProperty("receipt", "ignore:" + command.CommandId);
-                    }                
-                    frame.SetProperty("id", sessionId);
-                    frame.ToStream(dataOut);
-                }
-            }
-            else if(id is ConnectionId)
-            {
-                if(command.ResponseRequired)
-                {
-                    if(command.ResponseRequired)
-                    {
-                        frame.SetProperty("receipt", "ignore:" + command.CommandId);
-                    }   
-                    frame.SetProperty("id", id);
-                    frame.ToStream(dataOut);
-                }
             }
         }
 
diff --git a/src/main/csharp/Session.cs b/src/main/csharp/Session.cs
index cbd168b..976e7fa 100755
--- a/src/main/csharp/Session.cs
+++ b/src/main/csharp/Session.cs
@@ -256,10 +256,6 @@
                 }
                 finally
                 {
-                    // Make sure we attempt to inform the broker this Session is done.
-                    RemoveInfo info = new RemoveInfo();
-                    info.ObjectId = this.info.SessionId;
-                    this.connection.Oneway(info);
                     this.connection = null;
                     this.closed = true;
                     this.closing = false;
@@ -342,7 +338,6 @@
             {
                 producer = new MessageProducer(this, command);
                 producers[producerId] = producer;
-                this.connection.Oneway(command);
             }
             catch(Exception)
             {
@@ -519,7 +514,7 @@
 
         public IMapMessage CreateMapMessage()
         {
-            return ConfigureMessage(new MapMessage()) as IMapMessage;
+            throw new NotSupportedException("No Object Message in Stomp");
         }
 
         public IBytesMessage CreateBytesMessage()
@@ -536,7 +531,7 @@
 
         public IStreamMessage CreateStreamMessage()
         {
-            return ConfigureMessage(new StreamMessage()) as IStreamMessage;
+            throw new NotSupportedException("No Object Message in Stomp");
         }
 
         public IObjectMessage CreateObjectMessage(object body)
