# prep undercloud with required packages
         uc_builder.add_upstream_packages(uc_image)
         uc_builder.inject_calipso_installer(APEX_TEMP_DIR, uc_image)
+        # upgrade OVS in undercloud
+        shutil.copyfile(os.path.join(args.deploy_dir, 'build_ovs_nsh.sh'),
+                        os.path.join(APEX_TEMP_DIR, 'build_ovs_nsh.sh'))
+        virt_utils.virt_customize(
+            [{constants.VIRT_RUN_CMD: 'yum -y upgrade kernel'}],
+            uc_image
+        )
+        oc_builder.inject_ovs_nsh(uc_image, APEX_TEMP_DIR)
         # add patches from upstream to undercloud and overcloud
         logging.info('Adding patches to undercloud')
         patches = deployment.determine_patches()
         else:
             net_data = False
 
-        shutil.copyfile(os.path.join(args.deploy_dir, 'build_ovs_nsh.sh'),
-                        os.path.join(APEX_TEMP_DIR, 'build_ovs_nsh.sh'))
-
         # TODO(trozet): Either fix opnfv env or default to use upstream env
         if args.env_file == 'opnfv-environment.yaml':
             # Override the env_file if it is defaulted to opnfv
 
         args.snapshot = False
         assert_raises(ApexDeployException, validate_deploy_args, args)
 
+    @patch('apex.deploy.oc_builder')
     @patch('apex.deploy.ApexDeployment')
     @patch('apex.deploy.uc_builder')
     @patch('apex.deploy.network_data.create_network_data')
                   mock_utils, mock_parsers, mock_oc_cfg,
                   mock_virt_utils, mock_inv, mock_build_vms, mock_uc_lib,
                   mock_oc_deploy, mock_shutil, mock_network_data,
-                  mock_uc_builder, mock_deployment):
+                  mock_uc_builder, mock_deployment, mock_oc_builder):
         net_sets_dict = {'networks': MagicMock(),
                          'dns_servers': 'test'}
         ds_opts_dict = {'global_params': MagicMock(),
         main()
         mock_snap_deployment.assert_called()
 
+    @patch('apex.deploy.oc_builder')
     @patch('apex.deploy.ApexDeployment')
     @patch('apex.deploy.uc_builder')
     @patch('apex.deploy.network_data.create_network_data')
                        mock_utils, mock_parsers, mock_oc_cfg,
                        mock_virt_utils, mock_inv, mock_build_vms, mock_uc_lib,
                        mock_oc_deploy, mock_shutil, mock_network_data,
-                       mock_uc_builder, mock_deployment):
+                       mock_uc_builder, mock_deployment, mock_oc_builder):
         # didn't work yet line 412
         # net_sets_dict = {'networks': {'admin': {'cidr': MagicMock()}},
         #                 'dns_servers': 'test'}
         # TODO(trozet) add assertions here with arguments for functions in
         # deploy main
 
+    @patch('apex.deploy.oc_builder')
     @patch('apex.deploy.ApexDeployment')
     @patch('apex.deploy.uc_builder')
     @patch('apex.deploy.network_data.create_network_data')
                       mock_utils, mock_parsers, mock_oc_cfg,
                       mock_virt_utils, mock_inv, mock_build_vms, mock_uc_lib,
                       mock_oc_deploy, mock_git, mock_shutil,
-                      mock_network_data, mock_uc_builder, mock_deployment):
+                      mock_network_data, mock_uc_builder, mock_deployment,
+                      mock_oc_builder):
         net_sets_dict = {'networks': MagicMock(),
                          'dns_servers': 'test'}
         ds_opts_dict = {'global_params': MagicMock(),