diff --git a/ChangeLog b/ChangeLog
index 742d7b47..a33541c5 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2010-06-13  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
+
+	Replaced dynamic_pointer_cast with static_pointer_cast
+	* src/DHTSetup.cc
+	* src/DefaultBtMessageReceiver.cc
+	* src/SharedHandle.h
+
 2010-06-13  Tatsuhiro Tsujikawa  <t-tujikawa@users.sourceforge.net>
 
 	Reverted changes which deleted peerConnection from
diff --git a/src/DHTSetup.cc b/src/DHTSetup.cc
index 045f28e1..3c21fd78 100644
--- a/src/DHTSetup.cc
+++ b/src/DHTSetup.cc
@@ -199,7 +199,8 @@ void DHTSetup::setup(std::vector<Command*>& commands, DownloadEngine* e)
        deserializer.getSerializedTime().
        difference() >= DHT_BUCKET_REFRESH_INTERVAL) {
       SharedHandle<DHTBucketRefreshTask> task
-        (dynamic_pointer_cast<DHTBucketRefreshTask>(taskFactory->createBucketRefreshTask()));
+        (static_pointer_cast<DHTBucketRefreshTask>
+         (taskFactory->createBucketRefreshTask()));
       task->setForceRefresh(true);
       taskQueue->addPeriodicTask1(task);
     }
diff --git a/src/DefaultBtMessageReceiver.cc b/src/DefaultBtMessageReceiver.cc
index c03b6237..15ce0bf9 100644
--- a/src/DefaultBtMessageReceiver.cc
+++ b/src/DefaultBtMessageReceiver.cc
@@ -103,7 +103,7 @@ BtMessageHandle DefaultBtMessageReceiver::receiveMessage() {
   msg->validate();
   if(msg->getId() == BtPieceMessage::ID) {
     SharedHandle<BtPieceMessage> piecemsg =
-      dynamic_pointer_cast<BtPieceMessage>(msg);
+      static_pointer_cast<BtPieceMessage>(msg);
     piecemsg->setRawMessage(_peerConnection->detachBuffer());
   }
   return msg;
diff --git a/src/SharedHandle.h b/src/SharedHandle.h
index 39d2254a..c2ebb450 100644
--- a/src/SharedHandle.h
+++ b/src/SharedHandle.h
@@ -267,6 +267,12 @@ dynamic_pointer_cast(const SharedHandle<S>& t) {
   }
 }
 
+template<typename T, typename S>
+SharedHandle<T>
+static_pointer_cast(const SharedHandle<S>& t) {
+  return SharedHandle<T>(t, static_cast<T*>(t.get()));
+}
+
 template<typename T>
 std::ostream& operator<<(std::ostream& o, const SharedHandle<T>& sp) {
   o << *sp._obj;