ReEngineering or re-engineering of a software application is a process by which the application is changed in a way that does not affect its fundamental functional requirements, but does make changes other fundamental decisions regarding architecture, external dependencies, or even language/runtime. The changes involved here are more significant than those of ReFactoring, which primarily describes improvements to efficiency, readability and maintainability of code within the existing architecture, language and runtime.