Контрнаступление советских войск Юго-Западного фронта назначалось на 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 км. Польский фронт на Украине оказался расколотым на две части. Потеряв управление своими войсками, польский штаб во главе с Пилсудским, находившийся в Житомире, в спешке передислоцировался в Новоград-Волынский.
Выход частей 1-й Конной армии в глубокий тыл 3-й польской армии и успешное продвижение ударной группы 12-й армии создали благоприятные условия для полного окружения польских войск в районе Киева. Реввоенсовет Юго-Западного фронта 8 июня потребовал от 12-й армии занять район станций Бородянка и Ирша, с тем чтобы перерезать последнюю магистраль Киев — Коростень, по которой поляки еще имели возможность отвести свои войска из района Киева.
Начавшийся отвод польских войск к Киеву способствовал советскому наступлению. Уже 8 июня Фастовская группа в результате стремительной атаки бригады Котовского захватила город Сквиру. Затем части Фастовской группы заняли города Белая Церковь и Фастов, отрезав тем самым пути отхода противника из района Киева на юг и юго-запад. Выполняя поставленную задачу по окружению польских войск в районе Киева, большевистские войска усилили натиск.
9 июня 1-я Конная армия начала наступление на Киев, нанося удар с тыла по 3-й польской армии, которая вынуждена была поспешно отступать. В связи с тем, что войска Фастовской группы заняли Фастов, а 3-я польская армия начала отход из района Киева, командование Юго-Западного фронта посчитало дальнейшее продвижение Конной армии на восток излишним. Полагая, что войск 12-й армии и Фастовской группы будет достаточно для разгрома 3-й польской армии, 10 июня РВС Юго-Западного фронта приказал 1-й Конной армии повернуть на запад и выйти в район Житомир — Казатин для дальнейшего удара по тылам 6-й польской армии.
3-я польская армия сумела выйти из критического положения беспрепятственно, почти нигде не встречая противодействия конницы Буденного. В итоге 3-й армии удалось избежать разгрома.
Тем не менее прорыв 1-й Конной армией фронта польских войск на Украине позволил советским войскам захватить стратегическую инициативу. 15 июня 1920 года войска Юго-Западного фронта начали преследовать отходившие на запад войска противника. Поражение 3-й армии заставило польское командование с утра 13 июня начать отвод на запад 6-й армии. Советские войска, заняв Гайсин, начали преследовать отступавшие части. 20 июня части 14-й армии овладели станциями Калиновка и Жмеринка. К 20 июня советские войска вышли на линию Житомир — Бердичев — Казатин — Винница.
Прорыв фронта на Украине обнажил фланг польских войск Северо-Восточного фронта. Это привело к тому, что 18 июня начался отход польских частей, находившихся перед Мозырской группой Западного фронта в районе города Речицы. Большевистские войска форсировали Днепр и, развернув наступление на его правом берегу, в ночь на 29 июня заняли Мозырь. Выход войск Западного фронта в этот район нарушал оборону польских войск, действовавших в Белоруссии. Развивая наступление, левофланговые дивизии Западного фронта к 30 июня вышли на рубеж железнодорожной линии Жлобин — Мозырь.
В ходе отступления поляки активно применяли тактику «выжженной земли». Так, в Киеве были выведены из строя электростанция, городская канализация, пассажирская и товарная станции. Большевики попытались обернуть эти факты в свою пользу. Так, в ноте, адресованной Западу, правительства РСФСР и УССР заявили, что «прекрасный собор Святого Владимира, эта не имеющая себе равных жемчужина русского религиозного зодчества и уникальный памятник с бесценными фресками Васнецова, был уничтожен поляками при отступлении только потому, что они желали выместить свою злобу, хотя бы на неодушевленных предметах». Вскоре выяснилось, что Владимирский собор не пострадал…
В свою очередь, польский Красный Крест в июне направил протест в Международную организацию Красного Креста по поводу того, что при отступлении Красной Армии в Бердичеве, Житомире и Киеве были взяты заложники из гражданского населения и вывезены далеко в тыл, что «при возвращении в Бердичев красноармейцы выбрасывали из лазаретов Красного Креста всех больных и раненых, не щадя чести и жизни врачебного персонала». «Большевики пытают пленных, — говорилось в документе, — чтобы получить от них военные сведения, поступая против азбучного понимания о правилах ведения войны».
Развивая наступление, армии Юго-Западного фронта в середине июля вступили на территорию Польши (Западной Украины). После занятия Ровно 1-я Конная армия оказалась втянута в упорные бои в районе Дубно-Кременец, который несколько раз переходил из рук в руки. Все же большевикам 12–21 июля удалось продвинуться в направлении Львова, что позволило и войскам 14-й армии ускорить наступление. Успехи Юго-Западного фронта способствовали созданию выгодных условий для перехода в общее наступление войскам Западного фронта, поскольку для спасения своих войск на Украине польское командование бросило туда все резервы и сняло часть сил, расположенных в Белоруссии.
Тем временем большевистское командование принимало меры по усилению войск Западного фронта, который только в июне получил более 58 тысяч человек пополнения. В составе Западного фронта насчитывалось 145 346 бойцов, 2758 пулеметов, 693 орудия, 12 бронепоездов, 30 бронемашин, 3 танка и 73 самолета. Польские войска насчитывали 75,3 тысячи бойцов с 464 орудиями. Войскам 4-й, 15-й и 3-й советских армий противостояла 1-я польская армия (генерал Жигадлович). Против советской 16-й армии и Мозырской группы действовали 4-я польская армия (генерал С. Шептицкий) и Полесская группа (генерал В. Сикорский). На направлении главного удара большевистские войска Западного фронта превосходили поляков в 3 раза. В полосе же действия 16-й армии и Мозырской группы превосходство было незначительным. Польское командование, ожидавшее нового советского наступления в Белоруссии, предлагало отвести войска на линию Барановичи — Лида — Ораны — Вильно, но генерал Шептицкий считал, что следует все же попытаться остановить наступление большевиков на имеющейся линии фронта.