diff --git a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/AMQPSession.java b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/AMQPSession.java
index b28dabd..d93563d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/AMQPSession.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/rabbitmq/AMQPSession.java
@@ -50,7 +50,7 @@
   }
 
   public void connect() {
-    LOGGER.info("Connect to " + properties.getString(Keys.AMQP_URI) + "...");
+    LOGGER.info("Connect to {}...", properties.getString(Keys.AMQP_URI));
     ConnectionFactory factory = new ConnectionFactory();
     try {
       if (StringUtils.isNotEmpty(properties.getString(Keys.AMQP_URI))) {
@@ -65,62 +65,92 @@
         connection.addShutdownListener(this);
         LOGGER.info("Connection established.");
       }
-      bind();
+      setUp();
     } catch (URISyntaxException ex) {
-      LOGGER.error("URI syntax error: " + properties.getString(Keys.AMQP_URI));
+      LOGGER.error("URI syntax error: {}", properties.getString(Keys.AMQP_URI));
     } catch (IOException ex) {
       LOGGER.error("Connection cannot be opened.");
     } catch (Exception ex) {
-      LOGGER.warn("#connect: " + ex.getClass().getName());
+      LOGGER.warn("Connection has something error. it will be disposed.", ex);
     }
   }
 
-  private void bind() {
+  private void setUp() {
     if (connection != null && publishChannel == null) {
       try {
-        Channel ch = connection.createChannel();
-        LOGGER.info("Channel is opened.");
+        Channel ch;
+        ch = connection.createChannel();
+        LOGGER.info("Open Channel.");
+
         if (properties.getBoolean(Keys.QUEUE_DECLARE)) {
           LOGGER.info("Declare queue...");
           if (StringUtils.isNotEmpty(properties.getString(Keys.QUEUE_NAME))) {
-            LOGGER.info("Declare queue: " + properties.getString(Keys.QUEUE_NAME));
-            ch.queueDeclare(properties.getString(Keys.QUEUE_NAME),
-                properties.getBoolean(Keys.QUEUE_DURABLE),
-                properties.getBoolean(Keys.QUEUE_EXCLUSIVE),
-                properties.getBoolean(Keys.QUEUE_AUTODELETE), null);
-          }
-
-          if (properties.getBoolean(Keys.EXCHANGE_DECLARE)) {
-            LOGGER.info("Declare exchange...");
-            if (StringUtils.isNotEmpty(properties.getString(Keys.EXCHANGE_NAME))) {
-              LOGGER.info("Declare exchange: " + properties.getString(Keys.EXCHANGE_NAME));
-              ch.exchangeDeclare(properties.getString(Keys.EXCHANGE_NAME),
-                  properties.getString(Keys.EXCHANGE_TYPE),
-                  properties.getBoolean(Keys.EXCHANGE_DURABLE),
-                  properties.getBoolean(Keys.EXCHANGE_AUTODELETE), null);
+            try {
+              ch.queueDeclarePassive(properties.getString(Keys.QUEUE_NAME));
+              LOGGER.info("Queue \"{}\" already exist.", properties.getString(Keys.QUEUE_NAME));
+            } catch (Exception ex) {
+              createQueue(ch);
             }
           }
-
-          if (properties.getBoolean(Keys.BIND_STARTUP)) {
-            if (StringUtils.isNotEmpty(properties.getString(Keys.QUEUE_NAME)) &&
-                StringUtils.isNotEmpty(properties.getString(Keys.EXCHANGE_NAME))) {
-              LOGGER.info("Bind exchange and queue with key: " + properties.getString(Keys.BIND_ROUTINGKEY));
-              ch.queueBind(properties.getString(Keys.QUEUE_NAME),
-                  properties.getString(Keys.EXCHANGE_NAME),
-                  properties.getString(Keys.BIND_ROUTINGKEY));
-            }
-          }
-
-          publishChannel = ch;
-          LOGGER.info("Complete to setup channel.");
         }
+
+        if (properties.getBoolean(Keys.EXCHANGE_DECLARE)) {
+          LOGGER.info("Declare exchange...");
+          if (StringUtils.isNotEmpty(properties.getString(Keys.EXCHANGE_NAME))) {
+            try {
+              ch.exchangeDeclarePassive(properties.getString(Keys.EXCHANGE_NAME));
+              LOGGER.info("Exchange \"{}\" already exist.", properties.getString(Keys.EXCHANGE_NAME));
+            } catch (Exception ex) {
+              createExchange(ch);
+            }
+          }
+        }
+
+        if (properties.getBoolean(Keys.BIND_STARTUP)) {
+          if (StringUtils.isNotEmpty(properties.getString(Keys.QUEUE_NAME)) &&
+              StringUtils.isNotEmpty(properties.getString(Keys.EXCHANGE_NAME))) {
+            LOGGER.info("Bind exchange and queue with key: {}", properties.getString(Keys.BIND_ROUTINGKEY));
+            ch.queueBind(properties.getString(Keys.QUEUE_NAME),
+                properties.getString(Keys.EXCHANGE_NAME),
+                properties.getString(Keys.BIND_ROUTINGKEY));
+          }
+        }
+
+        publishChannel = ch;
+        LOGGER.info("Complete to setup channel.");
       } catch (Exception ex) {
-        LOGGER.warn("#bind: " + ex.getClass().getName());
+        LOGGER.warn("Channel has something error. Connection will be disconnected.", ex);
         disconnect();
       }
     }
   }
 
+  public void createQueue(Channel ch) throws IOException {
+    LOGGER.info("Declare queue: {}", properties.getString(Keys.QUEUE_NAME));
+    ch.queueDeclare(properties.getString(Keys.QUEUE_NAME),
+        properties.getBoolean(Keys.QUEUE_DURABLE),
+        properties.getBoolean(Keys.QUEUE_EXCLUSIVE),
+        properties.getBoolean(Keys.QUEUE_AUTODELETE), null);
+  }
+
+  public void createExchange(Channel ch) throws IOException {
+    LOGGER.info("Declare exchange: {}", properties.getString(Keys.EXCHANGE_NAME));
+    ch.exchangeDeclare(properties.getString(Keys.EXCHANGE_NAME),
+        properties.getString(Keys.EXCHANGE_TYPE),
+        properties.getBoolean(Keys.EXCHANGE_DURABLE),
+        properties.getBoolean(Keys.EXCHANGE_AUTODELETE), null);
+  }
+
+  public void bind(Channel ch) throws IOException {
+    LOGGER.info("Bind exchange \"{}\" and queue \"{}\"with key: {}", new Object[]{
+        properties.getString(Keys.QUEUE_NAME),
+        properties.getString(Keys.EXCHANGE_NAME),
+        properties.getString(Keys.BIND_ROUTINGKEY)});
+    ch.queueBind(properties.getString(Keys.QUEUE_NAME),
+        properties.getString(Keys.EXCHANGE_NAME),
+        properties.getString(Keys.BIND_ROUTINGKEY));
+  }
+
   public void disconnect() {
     LOGGER.info("Disconnecting...");
     try {
@@ -128,7 +158,8 @@
         connection.close();
       }
     } catch (Exception ex) {
-      LOGGER.warn("#disconnect: " + ex.getClass().getName());
+      LOGGER.warn("Error when close connection." , ex);
+    } finally {
       connection = null;
       publishChannel = null;
     }
@@ -143,15 +174,34 @@
             properties.getBasicProperties(),
             message.getBytes(CharEncoding.UTF_8));
       } catch (Exception ex) {
-        LOGGER.warn("#sendMessage: " + ex.getClass().getName());
+        LOGGER.warn("Error when sending meessage.", ex);
       }
     }
   }
 
   @Override
-  public void shutdownCompleted(ShutdownSignalException arg0) {
-    LOGGER.info("Disconnected.");
-    connection = null;
-    publishChannel = null;
+  public void shutdownCompleted(ShutdownSignalException exception) {
+    Object obj = exception.getReference();
+
+    if (obj instanceof Channel) {
+      LOGGER.info("Channel closed.");
+      publishChannel = null;
+      if (!exception.isInitiatedByApplication()) {
+        if (connection != null && connection.isOpen()) {
+          try {
+            LOGGER.info("Reopen channel...");
+            publishChannel = connection.createChannel();
+          } catch (Exception ex) {
+            LOGGER.warn("Cannot reopen channel. Connection will be disconnected.", ex);
+            disconnect();
+          }
+        }
+      }
+    } else if (obj instanceof Connection) {
+      LOGGER.info("Connection disconnected.");
+      if (!exception.isInitiatedByApplication()) {
+        connection = null;
+      }
+    }
   }
 }
