Have you ever tried putting your son in "time out" when a poor choice is made?
A carpet square, or little chair that is isolated, and he sits there for one minute for every year old he is - so four minutes. When the time is up, he needs to apologize for his poor behavior, you give him a kiss, it's over.
I teach pre-school and have raised four children. Just a suggestion.