diff --git a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java
index 9d6400de..5a4fb7c5 100644
--- a/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java
+++ b/LaunchServer/src/main/java/pro/gravit/launchserver/LaunchServer.java
@@ -37,6 +37,7 @@
 import pro.gravit.launcher.Launcher;
 import pro.gravit.launcher.LauncherConfig;
 import pro.gravit.launcher.NeedGarbageCollection;
+import pro.gravit.launcher.downloader.UpdateData;
 import pro.gravit.launcher.hasher.HashedDir;
 import pro.gravit.launcher.hasher.HashedEntry;
 import pro.gravit.launcher.hwid.HWIDProvider;
@@ -915,7 +916,7 @@ public void syncUpdatesDir(Collection<String> dirs) throws IOException {
     private void processUpdate(Path updateDir, HashedDir updateHDir, String name) throws IOException {
     	updateHDir.walk(IOHelper.CROSS_SEPARATOR, (path, filename, entry) -> {
     		if (entry.getType().equals(HashedEntry.Type.DIR)) {
-                if (entry.size() < IOHelper.MB16) {
+                if (UpdateData.needsZip((HashedDir) entry)) {
                 	Path p = updateDir.resolve(path);
             		Path out = optimizedUpdatesDir.resolve(name).resolve(path);
                 	try (ZipOutputStream compressed = new ZipOutputStream(IOHelper.newOutput(out))) {
diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/downloader/UpdateData.java b/LauncherAPI/src/main/java/pro/gravit/launcher/downloader/UpdateData.java
new file mode 100644
index 00000000..227ad017
--- /dev/null
+++ b/LauncherAPI/src/main/java/pro/gravit/launcher/downloader/UpdateData.java
@@ -0,0 +1,37 @@
+package pro.gravit.launcher.downloader;
+
+import java.io.IOError;
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+
+import pro.gravit.launcher.hasher.HashedDir;
+import pro.gravit.launcher.hasher.HashedEntry;
+import pro.gravit.utils.helper.IOHelper;
+
+public final class UpdateData {
+	public static final int COUNT_LIMIT = 4;
+	public static final long AVG_LIMIT = IOHelper.MB*4;
+	public static final long TOTAL_LIMIT = IOHelper.MB*16;
+	
+	private UpdateData() {
+	}
+
+	public static boolean needsZip(HashedDir hDir) {
+        AtomicLong size = new AtomicLong();
+        AtomicInteger cnt = new AtomicInteger();
+        try {
+			hDir.walk(IOHelper.CROSS_SEPARATOR, (p,n,e) -> {
+				if (e.getType().equals(HashedEntry.Type.FILE)) {
+					cnt.incrementAndGet();
+					size.addAndGet(e.size());
+				}
+				return HashedDir.WalkAction.CONTINUE;
+			});
+		} catch (IOException e) {
+			throw new IOError(e); // never happen
+		}
+        long avg = size.get()/(long)cnt.get();
+        return size.get() < TOTAL_LIMIT && avg < AVG_LIMIT && cnt.get() > COUNT_LIMIT;
+	}
+}
diff --git a/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java b/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java
index 271af850..dc42f82c 100644
--- a/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java
+++ b/LauncherAPI/src/main/java/pro/gravit/launcher/request/update/UpdateRequest.java
@@ -11,11 +11,14 @@
 import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.StringTokenizer;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
 
 import pro.gravit.launcher.Launcher;
 import pro.gravit.launcher.LauncherAPI;
 import pro.gravit.launcher.LauncherNetworkAPI;
 import pro.gravit.launcher.downloader.ListDownloader;
+import pro.gravit.launcher.downloader.UpdateData;
 import pro.gravit.launcher.events.request.UpdateRequestEvent;
 import pro.gravit.launcher.hasher.FileNameMatcher;
 import pro.gravit.launcher.hasher.HashedDir;
@@ -212,7 +215,7 @@ public UpdateRequestEvent requestDo(StandartClientWebSocketService service) thro
                 } catch (IOException ex) {
                     LogHelper.error(ex);
                 }
-                if (getPathed(name, e.hdir).size() < IOHelper.MB16) {
+                if (UpdateData.needsZip((HashedDir)getPathed(name, e.hdir))) {
                     adds.add(new ListDownloader.DownloadTask(path, -1, true));
                     return HashedDir.WalkAction.SKIP_DIR;
                 }
diff --git a/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java b/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java
index 7fbe891b..b8c794a6 100644
--- a/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java
+++ b/LauncherCore/src/main/java/pro/gravit/utils/helper/IOHelper.java
@@ -62,7 +62,7 @@
 import pro.gravit.launcher.LauncherAPI;
 
 public final class IOHelper {
-	public static final long MB16 = 1 << 24;
+	public static final long MB = 1 << 20;
     private static final class DeleteDirVisitor extends SimpleFileVisitor<Path> {
         private final Path dir;
         private final boolean self;