diff --git a/src/common.h b/src/common.h
index c6002339c2e5a181e5ee485e36256c177201d63a..be84fcab098d6ecdc70e0bc88fd951bfc31408af 100644
--- a/src/common.h
+++ b/src/common.h
@@ -10,6 +10,11 @@ typedef unsigned int uint;
 #define PROJECT_NAME "CuteDNS" // Project name
 #define PROJECT_VER  0x000001  // 0xMMIIRR (MAJOR,MINOR,REVISION)
 
+/* Server. */
+#define SERVER_MGR_COUNT  2    // TCP + UDP
+#define DEFAULT_THR_COUNT 2    // Default thread count for socket manager
+#define DEFAULT_PORT 53531     // Default port
+
 /* Common includes.
  */
 
diff --git a/src/server/server.c b/src/server/server.c
index 2a2fe197d80c008c5e1da5c37c57ac801d18ad7c..b79b2314140653735f759528fe46f68fcec42475 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -8,11 +8,6 @@
 
 /*----------------------------------------------------------------------------*/
 
-static const unsigned short DEFAULT_PORT = 53531;
-static const int DEFAULT_THR_COUNT = 3;
-
-/*----------------------------------------------------------------------------*/
-
 cute_server *cute_create()
 {
     debug_server("Creating Server structure..\n");
@@ -43,12 +38,16 @@ cute_server *cute_create()
     debug_server("Done\n\n");
     debug_server("Creating Socket Manager structure..\n");
 
+    // Estimate number of threads/manager
+    long thr_count = sm_estimate_threads();
+    debug_server("Estimated number of threads per manager: %ld\n", thr_count);
+
     // Create socket handlers
-    server->manager[UDP] = sm_create(server->nameserver, &udp_master, &udp_worker, DEFAULT_THR_COUNT);
-    server->manager[TCP] = sm_create(server->nameserver, &tcp_master, &tcp_worker, 2*DEFAULT_THR_COUNT);
+    server->manager[UDP] = sm_create(server->nameserver, &udp_master, &udp_worker, thr_count);
+    server->manager[TCP] = sm_create(server->nameserver, &tcp_master, &tcp_worker, thr_count);
 
     // Check socket handlers
-    for(int i = 0; i < 2; i++) {
+    for(int i = 0; i < SERVER_MGR_COUNT; i++) {
         if (server->manager[i] == NULL ) {
 
             if(i == 1) {
@@ -130,7 +129,7 @@ int cute_wait(cute_server *server)
 void cute_stop( cute_server *server )
 {
     // Notify servers to stop
-    for(int i = 0; i < 2; i++) {
+    for(int i = 0; i < SERVER_MGR_COUNT; i++) {
         sm_stop(server->manager[i]);
     }
 }
diff --git a/src/server/server.h b/src/server/server.h
index cd4a12bbf47bb44622c370caa7ea5fe1943e3557..f0773b39676c9548a540c58fc78e57703546eba9 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -27,13 +27,17 @@
 typedef struct cute_server {
 
 	/*! @brief Reference to the socket manager structures. */
-    sm_manager* manager[2];         // TCP + UDP
+	 sm_manager* manager[SERVER_MGR_COUNT];
 
 	/*! @brief Reference to the name server structure. */
     ns_nameserver *nameserver;
 
 	/*! @brief Reference to the zone database structure. */
     zdb_database *zone_db;
+
+    /*! @brief @todo Server should have some state tracking.
+    uint state;
+    */
 } cute_server;
 
 /*----------------------------------------------------------------------------*/
diff --git a/src/server/socket-manager.c b/src/server/socket-manager.c
index 20c46103def7cb1c1c91fc9eea7e2066bd42c50d..ec21bb1fb7f63d5522daca065092a2325b6e4683 100644
--- a/src/server/socket-manager.c
+++ b/src/server/socket-manager.c
@@ -354,6 +354,17 @@ void sm_destroy( sm_manager **manager )
     *manager = NULL;
 }
 
+long sm_estimate_threads()
+{
+#ifdef _SC_NPROCESSORS_ONLN
+   long ret = sysconf(_SC_NPROCESSORS_ONLN);
+   if(ret >= 1)
+      return ret + 1;
+#endif
+
+   return DEFAULT_THR_COUNT;
+}
+
 /*----------------------------------------------------------------------------*/
 
 int sm_remove_event( int epfd, int socket )
diff --git a/src/server/socket-manager.h b/src/server/socket-manager.h
index 858039e183ac652a7abbcde3083288ee0eb58677..f1f539279dd885fd9edd37bbae7c9d9237d8dc03 100644
--- a/src/server/socket-manager.h
+++ b/src/server/socket-manager.h
@@ -117,6 +117,13 @@ void sm_stop( sm_manager *manager );
   */
 void sm_destroy( sm_manager **manager );
 
+/** Return optimal number of threads for instance.
+  * It is estimated as NUM_CPUs + 1.
+  * Fallback is DEFAULT_THR_COUNT  (\see common.h).
+  * \return number of threads
+  */
+long sm_estimate_threads();
+
 /* APIs for extending Socket Manager.
  * \todo Temporary APIs.
  */