diff --git a/core/models/caves.py b/core/models/caves.py
index e94ff74..11f7607 100644
--- a/core/models/caves.py
+++ b/core/models/caves.py
@@ -37,6 +37,28 @@ todo='''- Move utility function into utils.py
 - Restore constraint:   unique_together = (("area", "kataster_number"), ("area", "unofficial_number"))
 '''
 
+def writetrogglefile(filepath, filecontent):
+    '''Set permissions to rw-rw-r-- and commit the new saved file to git'''
+    filepath = Path(filepath)
+    cwd = filepath.parent
+    filename = filepath.name
+    git = settings.GIT
+
+    try:
+        with open(filepath, "w") as f:
+            os.chmod(filepath, 0o664) # set file permissions to rw-rw-r--
+            f.write(filecontent)
+            print(f'WRITING{cwd}---{filename} ')
+            call([git, "add", filename], cwd=cwd)
+            call([git, "commit", "-m", 'Online cave or entrance edit'], cwd=cwd)
+    except PermissionError:
+        message = f'CANNOT  save this file.\nPERMISSIONS incorrectly set on server for this file {filename}. Ask a nerd to fix this.'
+        return render(request,'errors/generic.html', {'message': message})
+    except:
+        message = f'CANNOT git on server for this file {filename}. Edits not saved.\nAsk a nerd to fix this.'
+        return render(request,'errors/generic.html', {'message': message})
+
+
 class Area(TroggleModel):
     short_name = models.CharField(max_length=100)
     name = models.CharField(max_length=200, blank=True, null=True)
@@ -202,19 +224,15 @@ class Cave(TroggleModel):
         return res
     
     def writeDataFile(self):
-        try:
-            f = open(os.path.join(settings.CAVEDESCRIPTIONS, self.filename), "w")
-        except:
-            subprocess.call(settings.FIX_PERMISSIONS) 
-            f = open(os.path.join(settings.CAVEDESCRIPTIONS, self.filename), "w")
+        filepath = os.path.join(settings.CAVEDESCRIPTIONS, self.filename)
+
         t = loader.get_template('dataformat/cave.xml')
         #c = Context({'cave': self})
         c = dict({'cave': self})
-        u = t.render(c)        
-        # u8 = u.encode("utf-8")
-        # f.write(u8)
-        f.write(u)
-        f.close()
+        u = t.render(c)
+        writetrogglefile(filepath, u)
+        return
+
         
     def getArea(self):
         areas = self.area.all()
@@ -382,18 +400,14 @@ class Entrance(TroggleModel):
             return Path(settings.ENTRANCEDESCRIPTIONS, self.filename)
 
     def writeDataFile(self):
-        try:
-            f = open(os.path.join(settings.ENTRANCEDESCRIPTIONS, self.filename), "w")
-        except:
-            subprocess.call(settings.FIX_PERMISSIONS) 
-            f = open(os.path.join(settings.ENTRANCEDESCRIPTIONS, self.filename), "w")
+        filepath = os.path.join(settings.ENTRANCEDESCRIPTIONS, self.filename)
+
         t = loader.get_template('dataformat/entrance.xml')
         c = dict({'entrance': self})
         u = t.render(c)
-        # u8 = u.encode("utf-8")
-        # f.write(u8)
-        f.write(u)
-        f.close()
+        writetrogglefile(filepath, u)
+        return
+
 
 class LogbookEntry(TroggleModel):
     """Single parsed entry from Logbook
diff --git a/core/views/expo.py b/core/views/expo.py
index 83dafa1..1acee15 100644
--- a/core/views/expo.py
+++ b/core/views/expo.py
@@ -312,8 +312,9 @@ def editexpopage(request, path):
             git = settings.GIT
             try:
                 with open(filepath, "w") as f:
+                    os.chmod(filepath, 0o664) # set file permissions to rw-rw-r--
                     f.write(result)
-                    #print(f'WROTE {cwd}---{filename} ')
+                    print(f'WRITING{cwd}---{filename} ')
                     subprocess.call([git, "add", filename], cwd=cwd)
                     subprocess.call([git, "commit", "-m", 'Edit this page'], cwd=cwd)
             except PermissionError: