diff --git a/src/imap/ngx_imap.c b/src/imap/ngx_imap.c
index 900dcb3..13855f1 100644
--- a/src/imap/ngx_imap.c
+++ b/src/imap/ngx_imap.c
@@ -2,6 +2,10 @@
 #include <ngx_config.h>
 #include <ngx_core.h>
 #include <ngx_event.h>
+#include <ngx_imap.h>
+
+
+static char *ngx_imap_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
 
 
 static ngx_command_t  ngx_imap_commands[] = {
@@ -30,5 +34,28 @@
     ngx_imap_commands,                     /* module directives */
     NGX_CORE_MODULE,                       /* module type */
     NULL,                                  /* init module */
-    NULL                                   /* init child */
+    NULL                                   /* init process */
 };
+
+
+static char *ngx_imap_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
+{
+    ngx_listening_t  *ls;
+
+    /* STUB */
+
+    ls = ngx_listening_inet_stream_socket(cf, 0, 8110);
+    if (ls == NULL) {
+        return NGX_CONF_ERROR;
+    }
+
+    ls->backlog = -1;
+    ls->handler = ngx_imap_init_connection;
+    ls->pool_size = 16384;
+    /* ls->post_accept_timeout = 0; */
+    ls->log = cf->cycle->new_log;
+
+    /* */
+
+    return NGX_CONF_OK;
+}
diff --git a/src/imap/ngx_imap.h b/src/imap/ngx_imap.h
new file mode 100644
index 0000000..5dc48df
--- /dev/null
+++ b/src/imap/ngx_imap.h
@@ -0,0 +1,32 @@
+#ifndef _NGX_IMAP_H_INCLUDED_
+#define _NGX_IMAP_H_INCLUDED_
+
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+
+
+typedef struct {
+    ngx_chain_t  *send;
+} ngx_imap_request_t;
+
+
+#define NGX_POP3_USER    1
+#define NGX_POP3_PASS    2
+#define NGX_POP3_APOP    3
+#define NGX_POP3_STAT    4
+#define NGX_POP3_LIST    5
+#define NGX_POP3_RETR    6
+#define NGX_POP3_DELE    7
+#define NGX_POP3_NOOP    8
+#define NGX_POP3_RSET    9
+#define NGX_POP3_TOP     10
+#define NGX_POP3_UIDL    11
+#define NGX_POP3_QUIT    12
+
+
+void ngx_imap_init_connection(ngx_connection_t *c);
+void ngx_imap_close_connection(ngx_connection_t *c);
+
+
+#endif /* _NGX_IMAP_H_INCLUDED_ */
diff --git a/src/imap/ngx_imap_handler.c b/src/imap/ngx_imap_handler.c
index 635ae02..bbedc9c 100644
--- a/src/imap/ngx_imap_handler.c
+++ b/src/imap/ngx_imap_handler.c
@@ -2,18 +2,56 @@
 #include <ngx_config.h>
 #include <ngx_core.h>
 #include <ngx_event.h>
+#include <ngx_imap.h>
+#include <nginx.h>
+
+
+static void ngx_imap_auth_state(ngx_event_t *rev);
+
+
+static char pop3_greeting[] = "+OK " NGINX_VER " ready" CRLF;
+static char imap_greeting[] = "* OK " NGINX_VER " ready" CRLF;
 
 
 void ngx_imap_init_connection(ngx_connection_t *c)
 {
+    ngx_int_t  rc;
+
     ngx_log_debug0(NGX_LOG_DEBUG_IMAP, c->log, 0,
                    "imap init connection");
 
-    if (ngx_close_socket(c->fd) == -1) {
+    c->log_error = NGX_ERROR_INFO;
 
-        /* we use ngx_cycle->log because c->log was in c->pool */
+    rc = ngx_send(c, pop3_greeting, sizeof(pop3_greeting) - 1);
 
-        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,
-                      ngx_close_socket_n " failed");
+    if (rc == NGX_ERROR) {
+        ngx_imap_close_connection(c);
+        return;
     }
+
+    c->read->event_handler = ngx_imap_auth_state;
+
+    if (ngx_handle_read_event(c->read, 0) == NGX_ERROR) {
+        ngx_imap_close_connection(c);
+        return;
+    }
+}
+
+
+static void ngx_imap_auth_state(ngx_event_t *rev)
+{
+    ngx_connection_t  *c;
+
+    c = rev->data;
+
+    ngx_imap_close_connection(c);
+}
+
+
+void ngx_imap_close_connection(ngx_connection_t *c)
+{
+    ngx_log_debug1(NGX_LOG_DEBUG_IMAP, c->log, 0,
+                   "close imap connection: %d", c->fd);
+
+    ngx_close_connection(c);
 }
diff --git a/src/imap/ngx_imap_parse.c b/src/imap/ngx_imap_parse.c
new file mode 100644
index 0000000..08ff863
--- /dev/null
+++ b/src/imap/ngx_imap_parse.c
@@ -0,0 +1,68 @@
+
+#include <ngx_config.h>
+#include <ngx_core.h>
+#include <ngx_event.h>
+#include <ngx_imap.h>
+
+
+ngx_int_t ngx_pop3_parse_command(ngx_imap_request_t *r)
+{
+    u_char  ch, *p, *c;
+    enum {
+        sw_start = 0,
+        sw_done
+    } state;
+
+    while (p < r->buf->last && state < sw_done) {
+        ch = *p++;
+
+        switch (state) {
+
+        /* POP3 commands */
+        case sw_start:
+            if (ch == ' ') {
+                c = r->buf->start;
+
+                if (p - 1 - m == 4) {
+
+                    if (*c == 'U' && *(c + 1) == 'S'
+                        && *(c + 2) == 'E' && *(c + 3) == 'R')
+                    {
+                        r->command = NGX_POP3_USER;
+
+                    } else if (*c == 'P' && *(c + 1) == 'A'
+                               && *(c + 2) == 'A' && *(c + 3) == 'S')
+                    {
+                        r->method = NGX_POP3_PASS;
+
+                    } else if (*c == 'Q' && *(c + 1) == 'U'
+                               && *(c + 2) == 'I' && *(c + 3) == 'T')
+                    {
+                        r->method = NGX_POP3_QUIT;
+
+                    } else if (*c == 'N' && *(c + 1) == 'O'
+                               && *(c + 2) == 'O' && *(c + 3) == 'P')
+                    {
+                        r->method = NGX_POP3_NOOP;
+                    }
+                }
+
+                state = sw_spaces_before_arg;
+                break;
+            }
+
+            if (ch < 'A' || ch > 'Z') {
+                return NGX_IMAP_PARSE_INVALID_COMMAND;
+            }
+
+            break;
+        }
+
+        /* suppress warning */
+        case sw_done:
+            break;
+        }
+    }
+
+    return NGX_OK;
+}
