--- a/a/django/contrib/gis/db/backends/base/operations.py
+++ a/b/django/contrib/gis/db/backends/base/operations.py
@@ -133,3 +133,6 @@ class BaseSpatialOperations(object):

     def spatial_ref_sys(self):
         raise NotImplementedError('subclasses of BaseSpatialOperations must a provide spatial_ref_sys() method')
+
+    def make_valid(self, geom):
+        return geom.buffer(0)
--- a/a/django/contrib/gis/db/backends/postgis/operations.py
+++ a/b/django/contrib/gis/db/backends/postgis/operations.py
@@ -9,6 +9,7 @@ class PostGISOperations(DatabaseOperations, BaseSpatialOperations):
 )
 from django.contrib.gis.db.backends.utils import SpatialOperator
 from django.contrib.gis.gdal import GDALRaster
+from django.contrib.gis.geometry.backend import Geometry
 from django.contrib.gis.measure import Distance
 from django.core.exceptions import ImproperlyConfigured
 from django.db.backends.postgresql.operations import DatabaseOperations
@@ -591,3 +591,17 @@ class PostGISOperations(DatabaseOperations, BaseSpatialOperations):

     def deconstruct_raster(self, value):
         return to_pgraster(value)
+
+    def make_valid(self, geom):
+        cursor = self.connection._cursor()
+        try:
+            try:
+                cursor.execute('SELECT ST_MakeValid(%s)', (self.Adapter(geom),))
+                row = cursor.fetchone()
+            except:
+                # Responsibility of callers to perform error handling.
+                raise
+        finally:
+            # Close out the connection.  See #9437.
+            self.connection.close()
+        return Geometry(row[0])
--- a/b/tests/gis_tests/test_make_valid.py
+++ a/b/tests/gis_tests/test_make_valid.py
@@ -0,0 +1,36 @@
+"""
+MakeValid enables to correct invalid geometry
+"""
+
+import unittest
+
+from django.db import connection
+from django.db.utils import DatabaseError
+from django.contrib.gis.geos import fromstr
+
+class MakeValidTest(unittest.TestCase):
+    "Testing the Make Valid operator"
+
+    def testEquality(self):
+        geom = fromstr('POINT(0 0)')
+        geom2 = connection.ops.make_valid(geom)
+        self.assertEqual(geom, geom2)
+
+    def testEmpty(self):
+        geom = fromstr('POLYGON EMPTY')
+        self.assertTrue(geom.valid)
+        geom2 = connection.ops.make_valid(geom)
+        self.assertEqual(geom2.wkt, "POLYGON EMPTY")
+
+    def testMakeValid(self):
+
+        OVERLAPPING_POLYGONS = 'MULTIPOLYGON(((-817919.2992374257 -993731.1603221426,-817903.1039358412 -993927.4507220673,-817513.0408654083 -993857.9949068283,-817564.0353255265 -993647.1541963345,-817919.2992374257 -993731.1603221426)),((-818062.2435801325 -993576.9766019919,-818040.2372730081 -993795.6885085825,-817671.0262602307 -993741.5098793216,-817720.6315932958 -993521.6543376467,-818062.2435801325 -993576.9766019919)),((-818213.5106938615 -993436.8959622316,-818182.2592243042 -993635.488124189,-817817.200519477 -993608.3730649975,-817854.7430425821 -993390.3676253688,-818213.5106938615 -993436.8959622316)))'
+
+        geom = fromstr(OVERLAPPING_POLYGONS)
+        self.assertFalse(geom.valid)
+
+        geom2 = connection.ops.make_valid(geom)
+        self.assertTrue(geom2.valid)
+
+        self.assertEqual(geom2.num_points, 23)
+        self.assertEqual(len(geom2), 3)
