diff --git a/mrdna/model/arbdmodel.py b/mrdna/model/arbdmodel.py
index 8cefb88c72a09df24e4c738f2bb9f55dad693e02..cd21983936f6b5b13659a08f5f9e7a4a2add4e9d 100644
--- a/mrdna/model/arbdmodel.py
+++ b/mrdna/model/arbdmodel.py
@@ -843,12 +843,14 @@ diffusion {diffusivity}
 """.format(**particleParams))
                 if 'grid' in particleParams:
                     if not isinstance(pt.grid, list): pt.grid = [pt.grid]
-                    for g in pt.grid:
-                        fh.write("gridFile {}\n".format(g))
-                    ## TODO: make this prettier? multiple scaling factors?
-                    gridFileScale = 1.0
-                    if 'gridFileScale' in pt.__dict__: gridFileScale = pt.gridFileScale
-                    fh.write("gridFileScale {}\n".format(gridFileScale))
+                    for g,s in pt.grid:
+                        ## TODO, use Path.relative_to?
+                        try:
+                            fh.write("gridFile {}\n".format(g.relative_to(os.getcwd())))
+                        except:
+                            fh.write("gridFile {}\n".format(g))
+
+                        fh.write("gridFileScale {}\n".format(s))
 
                 else:
                     fh.write("gridFile {}/null.dx\n".format(self.potential_directory))
diff --git a/mrdna/segmentmodel.py b/mrdna/segmentmodel.py
index 61ddfca9e9ddfa57e7459941503bbdebdbfab7cf..f260055a43198b8dd00f1564358e8bde204a12f9 100644
--- a/mrdna/segmentmodel.py
+++ b/mrdna/segmentmodel.py
@@ -1,4 +1,5 @@
 import pdb
+from pathlib import Path
 import numpy as np
 import random
 from .model.arbdmodel import PointParticle, ParticleType, Group, ArbdModel
@@ -1386,7 +1387,7 @@ class SegmentModel(ArbdModel):
 
         self._bonded_potential = dict() # cache for bonded potentials
         self._generate_strands()
-        self.potentials = []
+        self.grid_potentials = []
         self._generate_bead_model( max_basepairs_per_bead, max_nucleotides_per_bead, local_twist, escapable_twist)
 
         self.useNonbondedScheme( nbDnaScheme )
@@ -1908,6 +1909,7 @@ class SegmentModel(ArbdModel):
         for b,c in zip(beads,clusters):
             _assign_bead_type(b, cluster_size[c-1], decimals=order)
 
+        self._apply_grid_potentials_to_beads(beadtype_s)
 
         # for bead in [b for s in segments for b in s]:
         #     num_nt0 = bead.num_nt
@@ -2728,6 +2730,27 @@ proc calcforces {} {
             dx = dy = dz = max((dx,dy,dz))
         self.dimensions = [dx,dy,dz]
 
+    def add_grid_potential(self, grid_file, scale=1, per_nucleotide=True):
+        grid_file = Path(grid_file)
+        if not grid_file.is_file():
+            raise ValueError("Grid file {} does not exist".format(grid_file))
+        if not grid_file.is_absolute():
+            grid_file = Path.cwd() / grid_file
+        self.grid_potentials.append((grid_file,scale,per_nucleotide))
+
+    def _apply_grid_potentials_to_beads(self, bead_type_dict):
+        if len(self.grid_potentials) > 1:
+            raise NotImplementedError("Multiple grid potentials are not yet supported")
+
+        for grid_file, scale, per_nucleotide in self.grid_potentials:
+            for key,particle_type in bead_type_dict.items():
+                if particle_type.name[0] == "O": continue
+                s = scale*particle_type.nts if per_nucleotide else scale
+                try:
+                    particle_type.grid = particle_type.grid + (grid_file, s)
+                except:
+                    particle_type.grid = tuple((grid_file, s))
+
     def _generate_atomic_model(self, scale=1):
         ## TODO: deprecate
         self.generate_atomic_model(scale=scale)