diff --git a/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseApiException.java b/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseApiException.java
deleted file mode 100644
index 3d91d75aabc6e2fd930d305e441a9cc602f41025..0000000000000000000000000000000000000000
--- a/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseApiException.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package ru.yandex.metrika.clickhouse.except;
-
-import ru.yandex.metrika.clickhouse.CHException;
-
-/**
- * @author lopashev
- * @since 16.02.15
- */
-public class ClickhouseApiException extends CHException {
-
-    public ClickhouseApiException(Integer code, Throwable cause, String host, int port) {
-        super(code, cause, host, port);
-    }
-}
diff --git a/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseDbException.java b/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseDbException.java
deleted file mode 100644
index d8655c7aff975ca0b926e22beea908bd43f5055f..0000000000000000000000000000000000000000
--- a/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseDbException.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package ru.yandex.metrika.clickhouse.except;
-
-import ru.yandex.metrika.clickhouse.CHException;
-
-/**
- * @author lopashev
- * @since 16.02.15
- */
-public class ClickhouseDbException extends CHException {
-
-    public ClickhouseDbException(Integer code, Throwable cause, String host, int port) {
-        super(code, cause, host, port);
-    }
-}
diff --git a/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseErrorCode.java b/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseErrorCode.java
index 8ed2963a2487b3f8f5a014582b6b872ca230feae..f4f839e73d1ee6b02a7d0f4c45c47603f7c1d3bc 100644
--- a/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseErrorCode.java
+++ b/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseErrorCode.java
@@ -16,6 +16,7 @@ public enum ClickhouseErrorCode {
     NOT_IMPLEMENTED                         (48),
     LOGICAL_ERROR                           (49),
     TYPE_MISMATCH                           (53),
+    TABLE_ALREADY_EXISTS                    (57),
     UNKNOWN_TABLE                           (60),
     SYNTAX_ERROR                            (62),
     TOO_MUCH_ROWS                           (158),
@@ -23,12 +24,15 @@ public enum ClickhouseErrorCode {
     TOO_SLOW                                (160),
     TOO_MUCH_TEMPORARY_NON_CONST_COLUMNS    (166),
     TOO_BIG_AST                             (168),
+    CYCLIC_ALIASES                          (174),
     MULTIPLE_EXPRESSIONS_FOR_ALIAS          (179),
     SET_SIZE_LIMIT_EXCEEDED                 (191),
     SOCKET_TIMEOUT                          (209),
     NETWORK_ERROR                           (210),
     EMPTY_QUERY                             (211),
     MEMORY_LIMIT_EXCEEDED                   (241),
+    TOO_MUCH_PARTS                          (252),
+    DOUBLE_DISTRIBUTED                      (288),
     POCO_EXCEPTION                          (1000),
     UNKNOWN_EXCEPTION                       (1002);
 
@@ -46,38 +50,6 @@ public enum ClickhouseErrorCode {
         this.code = code;
     }
 
-    public static final Set<ClickhouseErrorCode> ALL = Collections.unmodifiableSet(EnumSet.allOf(ClickhouseErrorCode.class));
-
-    public static final Set<ClickhouseErrorCode> API = Collections.unmodifiableSet(EnumSet.of(
-            EMPTY_QUERY,
-            NOT_FOUND_COLUMN_IN_BLOCK,
-            ILLEGAL_TYPE_OF_ARGUMENT,
-            ILLEGAL_COLUMN,
-            UNKNOWN_IDENTIFIER,
-            NOT_IMPLEMENTED,
-            LOGICAL_ERROR,
-            TYPE_MISMATCH,
-            UNKNOWN_TABLE,
-            SYNTAX_ERROR,
-            TOO_MUCH_TEMPORARY_NON_CONST_COLUMNS,
-            TOO_BIG_AST,
-            MULTIPLE_EXPRESSIONS_FOR_ALIAS,
-            SET_SIZE_LIMIT_EXCEEDED,
-            MEMORY_LIMIT_EXCEEDED
-    ));
-
-    public static final Set<ClickhouseErrorCode> DB = Collections.unmodifiableSet(EnumSet.of(
-            ATTEMPT_TO_READ_AFTER_EOF,
-            SOCKET_TIMEOUT,
-            NETWORK_ERROR,
-            POCO_EXCEPTION
-    ));
-
-    public static final Set<ClickhouseErrorCode> QUERY = Collections.unmodifiableSet(EnumSet.of(
-            TOO_MUCH_ROWS,
-            TIMEOUT_EXCEEDED,
-            TOO_SLOW
-    ));
 
     public static ClickhouseErrorCode fromCode(Integer code) {
         return byCodes.get(code);
diff --git a/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseExceptionSpecifier.java b/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseExceptionSpecifier.java
index 56c3b489b6e90f29ed0200c8d15e6334b7a6e445..5c9ccce5c142f6bb42ef554964b0eaf6040f14dd 100644
--- a/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseExceptionSpecifier.java
+++ b/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseExceptionSpecifier.java
@@ -36,41 +36,6 @@ public final class ClickhouseExceptionSpecifier {
 
     private static final Logger log = Logger.of(ClickhouseExceptionSpecifier.class);
 
-    private static final Map<Integer, ClickhouseExceptionFactory> FACTORIES;
-
-    static {
-        Map<Integer, ClickhouseExceptionFactory> map = new HashMap<Integer, ClickhouseExceptionFactory>();
-        for (ClickhouseErrorCode errorCode : ClickhouseErrorCode.API)
-            map.put(errorCode.code, new ClickhouseExceptionFactory() {
-                @Override
-                public CHException create(Integer code, Throwable cause, String host, int port) {
-                    return new ClickhouseApiException(code, cause, host, port);
-                }
-            });
-        for (ClickhouseErrorCode errorCode : ClickhouseErrorCode.DB)
-            map.put(errorCode.code, new ClickhouseExceptionFactory() {
-                @Override
-                public CHException create(Integer code, Throwable cause, String host, int port) {
-                    return new ClickhouseDbException(code, cause, host, port);
-                }
-            });
-        for (ClickhouseErrorCode errorCode : ClickhouseErrorCode.QUERY)
-            map.put(errorCode.code, new ClickhouseExceptionFactory() {
-                @Override
-                public CHException create(Integer code, Throwable cause, String host, int port) {
-                    return new ClickhouseQueryException(code, cause, host, port);
-                }
-            });
-        FACTORIES = Collections.unmodifiableMap(map);
-    }
-
-    private static final ClickhouseExceptionFactory DEFAULT_FACTORY = new ClickhouseExceptionFactory() {
-        @Override
-        public CHException create(Integer code, Throwable cause, String host, int port) {
-            return new ClickhouseUnhandledException(code, cause, host, port);
-        }
-    };
-
     private ClickhouseExceptionSpecifier() {
     }
 
@@ -92,11 +57,11 @@ public final class ClickhouseExceptionSpecifier {
             if (cause instanceof SocketTimeoutException)
                 // если приехал STE, то скажем, что это запрос плохой, это не то же самое, что SOCKET_TIMEOUT от кликхауса
                 // хотя это также может значить падающий кликхаус, посмотрим что выглядит правдоподобнее
-                return new ClickhouseQueryException(ClickhouseErrorCode.TIMEOUT_EXCEEDED.code, cause, host, port);
+                return new CHException(ClickhouseErrorCode.TIMEOUT_EXCEEDED.code, cause, host, port);
             else if (cause instanceof ConnectTimeoutException || cause instanceof ConnectException)
                 // не смогли соединиться с кликхаусом за connectTimeout - в принципе, может быть никто не виноват
                 // среди наших сущностей (query/api/db), но обвинить кого-то надо, и это будет db
-                return new ClickhouseDbException(ClickhouseErrorCode.NETWORK_ERROR.code, cause, host, port);
+                return new CHException(ClickhouseErrorCode.NETWORK_ERROR.code, cause, host, port);
             else
                 return new ClickhouseUnhandledException(cause, host, port);
         }
@@ -110,11 +75,7 @@ public final class ClickhouseExceptionSpecifier {
             }
             // ошибку в изначальном виде все-таки укажем
             Throwable messageHolder = cause != null ? cause : new Throwable(clickhouseMessage);
-            if (FACTORIES.containsKey(code)) {
-                return FACTORIES.get(code).create(code, messageHolder, host, port);
-            } else {
-                return DEFAULT_FACTORY.create(code, messageHolder, host, port);
-            }
+            return new CHException(code, messageHolder, host, port);
         } catch (Exception e) {
             log.error("Unsupported clickhouse error format, please fix ClickhouseExceptionSpecifier, message: "
                             + clickhouseMessage + ", error: " + e.getMessage());
diff --git a/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseQueryException.java b/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseQueryException.java
deleted file mode 100644
index 3427f1c85e7c4682943e1a165f568eac039c849b..0000000000000000000000000000000000000000
--- a/src/main/java/ru/yandex/metrika/clickhouse/except/ClickhouseQueryException.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package ru.yandex.metrika.clickhouse.except;
-
-
-import ru.yandex.metrika.clickhouse.CHException;
-
-/**
- * @author lopashev
- * @since 16.02.15
- */
-public class ClickhouseQueryException extends CHException {
-
-    public ClickhouseQueryException(Integer code, Throwable cause, String host, int port) {
-        super(code, cause, host, port);
-    }
-}