Updated. Not finished