function SWEP:DoBodygroups(wm, custom_wm)
    if wm == nil then
        wm = false
        self:DoBodygroups(true)
    end
    if !wm and (!IsValid(self:GetOwner()) or self:GetOwner():IsNPC()) then return end

    local dbg = self:GetValue("DefaultBodygroups")

    local mdl

    if wm then
        mdl = custom_wm or self
        dbg = self:GetValue("DefaultWMBodygroups")
    else
        mdl = self:GetVM()
    end

    if !IsValid(mdl) then return end

    mdl:SetBodyGroups(dbg or "")

    local sk = self:GetValue("DefaultSkin")

    local eles = self:GetElements()

    for i, k in ipairs(eles) do
        if wm then
            for _, j in pairs(k.BGs_WM or {}) do
                if _ == "BaseClass" then continue end
                mdl:SetBodygroup(j[1], j[2] or 0)
            end
            if k.Skin_WM != nil then sk = k.Skin_WM end
        else
            for _, j in pairs(k.BGs_VM or {}) do
                if _ == "BaseClass" then continue end
                mdl:SetBodygroup(j[1] or 0, j[2] or 0)
            end
            if k.Skin_VM != nil then sk = k.Skin_VM end
        end
    end

    mdl:SetSkin(sk)

    local bbg = self:GetValue("BulletBodygroups")

    if bbg then
        local amt = self:Clip1()

        if self:GetReloading() then
            amt = self:GetLoadedRounds()
        end

        for c, bgs in pairs(bbg) do
            if amt < c then
                mdl:SetBodygroup(bgs[1], bgs[2])
                if !self.BulletBodygroupsSetAll then
                    break
                end
            end
        end
    end

    self:RunHook("Hook_PostDoBodygroups")
end

function SWEP:GetElements(holster)
    if !self.AttachmentElements then return {} end
    local eles = {}

    for i, k in pairs(self.Attachments) do
        if k.Installed then
            table.Add(eles, k.InstalledElements or {})

            local atttbl = TacRP.GetAttTable(k.Installed)

            table.Add(eles, atttbl.InstalledElements or {})
        else
            table.Add(eles, k.UnInstalledElements or {})
        end
    end
    local eleatts = {}

    local foldstock = false
    for i, k in pairs(eles) do
        if self.AttachmentElements[k] then
            table.insert(eleatts, self.AttachmentElements[k])
            foldstock = foldstock or k == "foldstock"
        end
    end

    -- Bipod bodygroup
    if self:GetInBipod() and self.AttachmentElements["bipod"] then
        table.insert(eleatts, self.AttachmentElements["bipod"])
    end

    -- Hack: Always fold stock when weapon is holstered
    if IsValid(self:GetOwner()) and self:GetOwner():IsPlayer()
            and self:GetOwner():GetActiveWeapon() != self and !foldstock
            and self.AttachmentElements["foldstock"] then
        table.insert(eleatts, self.AttachmentElements["foldstock"])
    end

    table.sort(eleatts, function(a, b)
        return (a.SortOrder or 1) < (b.SortOrder or 1)
    end)

    return eleatts
end

function SWEP:DoBulletBodygroups()
    self:DoBodygroups(false)
end
