29 апреля в командование Западным фронтом вступил печально известный М. Тухачевский. Новый командующий внес изменения в план операции. Главный удар должна была теперь наносить 15-я армия в общем направлении на Вильно, вспомогательный — 16-я армия на минском направлении. Правофланговые части 15-й армии, выделенные в особую Северную группу под командованием Е.Н. Сергеева, должны были форсировать реку Двину в районе Дисна-Полоцк и в последующем нанести удар в тыл противника, в направлении станции Загатье.
Потребовалось провести значительную перегруппировку сил и средств из центра фронта на его правый фланг, что заняло довольно много времени. Затруднения с транспортом, а также отсутствие должного руководства со стороны штаба фронта привели к тому, что перегруппировка сил к назначенному сроку операции полностью не была завершена. К тому же план операции был рассчитан на ведение безостановочного наступления без каких-либо резервов. Накануне наступления командование фронтом издало приказ, в котором требовало от командующих армиями использовать в наступлении все дивизии, не выделяя ничего для армейского резерва. Короткий срок, отведенный на подготовку наступления Западного фронта, не позволил полностью сосредоточить все людские силы и материально-технические средства, предназначенные для этой операции. Таким образом, неадекватные указания Тухачевского неизбежно должны были сказаться на ходе боевых действий.
К началу наступления войска Западного фронта располагались следующим образом. Северная группа войск занимала рубеж: Опочка—Дисна—Янополье. Южнее ее располагалась 15-я армия. Ее фронт проходил от Янополья до района 15 км юго-восточнее города Лепель. Далее по восточному берегу Березины действовали части 16-й армии. Ее левый фланг находился в районе города Речицы.
Рано утром 14 мая 1920 года 15-я армия и части Северной группы перешли в наступление. 16-я армия не смогла в этот день начать наступление, поскольку не завершила перегруппировку частей. Прикрываясь естественным препятствием, образуемым Березиной и ее притоками с их болотистой долиной, 8-я и 1 — я польские пехотные дивизии оказали упорное сопротивление, особенно в районе Полоцка и Лепеля. Но после упорных боев польская оборона была прорвана. Войска 15-й армии уже в первый день наступления продвинулись вперед на 6-20 км и заняли Лепель. Потерпев поражение, польские части начали отход на Свенцяны и Молодечно. К исходу 16 мая основные силы 15-й армии, наступавшие в северо-западном направлении, вышли на рубеж Дисна—Зябки. Командование Западного фронта 17 мая изменило направление удара Северной группы с юго-западного на северо-западное, а 15-й армии — с северо- западного на юго-западное. В результате этого войска 15-й армии и Северной группы стали растекаться по фронту в трех направлениях, удаленных друг от друга на 50–70 км. Кроме того, за 5 дней фронт наступления 15-й армии расширился с 60 до 110 км.
Поляки воспользовались замедлением темпа наступления большевиков и организовали планомерный отход своих частей, а также подтянули резервы. У большевиков резервов не было, кроме того, из-за отсутствия связи между командованием и тыловыми учреждениями фронта и армий, а также вследствие недостатка обозов нарушилось регулярное снабжение боеприпасами. Тем временем польское командование спешно подтягивало резервы, усиливая свои войска перед Западным фронтом. Подход свежих сил позволил уже к 30 мая остановить дальнейшее продвижение войск Западного фронта. За 17 дней наступления части 15-й армии продвинулись вперед только на 110–130 км.
Для восстановления утраченных позиций польское командование создало ударные группы войск. Контрудар начался 31 мая. Армии Западного фронта, оказавшись без резервов и боеприпасов, утомленные и к тому же плохо управляемые командованием и штабом фронта, начали отступление. Только части 15-й армии потеряли убитыми, ранеными и пропавшими без вести 12 132 человека. К 8 июня 1920 года они были отброшены на 60—100 км до линии Узмены—Березино—река Березина, где фронт стабилизировался. Таким образом, за время с 1 по 8 июня поляки оттеснили большевиков почти на их исходные рубежи.
Еще 26 апреля Политбюро решило перебросить на Юго-Западный фронт часть войск с Кавказского фронта и ускорить перевозку запасных частей. В мае 1920 года Юго-Западный фронт получил более 41 тысячи человек пополнения. Одновременно на Юго-Западный фронт перебрасывалась с Северного Кавказа 1-я Конная армия. 29 мая началась перевозка на Украину 25-й Чапаевской дивизии. В апреле 1920 года на Юго-Западный фронт прибыла с Урала Башкирская кавалерийская бригада и другие части.
Контрнаступление советских войск Юго-Западного фронта назначалось на 26 мая 1920 года. Однако в этот день перешли в наступление фактически только 14-я армия и Фастовская группа. 12-я армия к этому сроку еще не закончила перегруппировку своих войск и подготовку переправы через Днепр. Попытки небольших групп этой армии переправиться 27 мая через Днепр в районе Страхолесье (севернее Киева) оказались безуспешными. Поляки с противоположного берега реки и с моторных лодок встретили группы советских бойцов сильным ружейно-пулеметным огнем. Подразделения 12-й армии вынуждены были прекратить переправу через Днепр и возвратиться в исходное положение. В последующие дни войска 12-й армии начали фронтальное наступление на Киев. Однако противник оказал ожесточенное сопротивление. Атаки советских войск оказались безуспешными. Боевые действия на участке Фастовской группы и 14-й армии с первого же дня приняли ожесточенный характер. Части Фастовской группы, стремительно атаковав противника, прорвали фронт в районе восточнее Белой Церкви. Однако поляки, собрав значительные силы, в ночь на 30 мая предприняли контратаку. Рассредоточенность войск Фастовской группы на широком фронте и отсутствие резервов привели к тому, что она не выдержала натиска и ко 2 июня была оттеснена на исходные позиции. Не добилась существенных успехов в эти дни и 14-я армия.
26 мая начала выдвигаться на исходное положение 1-я Конная армия. На своем пути ей пришлось вести бои с повстанческими отрядами Куровского. Так, 28 мая 4-я кавалерийская дивизия в районе Пятигор разгромила Запорожский повстанческий полк. Были захвачены пленные, пулеметы и большое количество патронов. В этот же день развернулись бои большевистских конников с польскими войсками. Наступление 1 -й Конной армии велось на фронте протяженностью 40 км. 29 мая 4-я кавалерийская дивизия атаковала конницу поляков, принудив ее к отходу. Одновременно она выбила польские пехотные части из Ново- Фастова.
Бои продолжались и становились более упорными и ожесточенными. 30 мая поляки ввели в сражение свежие части. Им удалось выбить большевиков из Ново-Фастова и Липовца. Последующие попытки 1-й Конной армии прорвать оборону поляков не увенчались успехом. 31 мая на сторону поляков перешло 3 эскадрона 81-го полка 14-й кавдивизии, состоявших в основном из донских казаков бывшей деникинской армии.
В начале лета 1920 года Реввоенсовет Юго-Западного фронта приказал командующим армиями отказаться от лобовых атак вражеских укреплений, тщательно готовить каждую наступательную операцию, на важнейших направлениях действовать ударными группами. Еще 31 мая РВС Юго-Западного фронта дал указание командованию 12-й армии прекратить фронтальные атаки Киева, оставить против киевского плацдарма противника только 58-ю стрелковую дивизию. Все остальные силы армии свести в ударную группу для форсирования реки Днепр и прорыва фронта севернее Киева.
1-я Конная армия была сосредоточена на участке в 10 км северо-восточнее Ново-Фастова. К вечеру 3 июня 1-я Конная армия заняла исходный рубеж для наступления. В эти дни стояла дождливая погода. Польское командование рассчитывало, что плохая погода помешает советским войскам начать военные действия. Более того, оно было уверено в том, что советская кавалерия понесла значительные потери, и само готовило наступление с целью окончательного разгрома армии Буденного. На рассвете 5 июня 1-я Конная армия перешла в наступление. Дождь и густой туман позволили большевикам скрытно выйти на рубеж атаки и перейти в стремительное наступление. Когда же польские войска заметили советских бойцов, было уже поздно. Через два часа после начала атаки польский фронт был прорван в районе Сквира— Самгородок.
Наступление советских войск было настолько стремительным, что к вечеру того же дня 1-я Конная армия прорвалась севернее и восточнее Казатина, разрушив в ряде мест железную дорогу Фастов— Казатин— Липовец, и вышла в тыл 3-й польской армии. В 18 часов 7 июня 4-я кавалерийская дивизия овладела Житомиром, уничтожив польский гарнизон и освободив из плена 7 тысяч красноармейцев, которые сразу же встали в строй. В этот же день 11 — я кавалерийская дивизия заняла Бердичев. Глубина прорыва 1-й Конной армии в тыл польских войск составила 120–140 км. Польский фронт на Украине оказался расколотым на две части. Потеряв управление своими войсками, польский штаб во главе с Пилсудским, находившийся в Житомире, в спешке передислоцировался в Новоград-Волынский.