diff --git a/news/37.feature b/news/37.feature
new file mode 100644
index 0000000..d02db7e
--- /dev/null
+++ b/news/37.feature
@@ -0,0 +1,1 @@
+OmegaConf.save() now takes a resolve flag (defaults False)
\ No newline at end of file
diff --git a/omegaconf/omegaconf.py b/omegaconf/omegaconf.py
index 7cd4568..3699447 100644
--- a/omegaconf/omegaconf.py
+++ b/omegaconf/omegaconf.py
@@ -65,13 +65,14 @@ class OmegaConf:
             raise TypeError("Unexpected file type")
 
     @staticmethod
-    def save(config, f):
+    def save(config, f, resolve=False):
         """
         Save as configuration object to a file
         :param config: omegaconf.Config object (DictConfig or ListConfig).
         :param f: filename or file object
+        :param resolve: True to save a resolved config (defaults to False)
         """
-        data = config.pretty()
+        data = config.pretty(resolve=resolve)
         if isinstance(f, str):
             with io.open(os.path.abspath(f), "w", encoding="utf-8") as f:
                 f.write(six.u(data))

add resolve flag to save function
diff --git a/tests/test_serialization.py b/tests/test_serialization.py
index 97f011b..f52e687 100644
--- a/tests/test_serialization.py
+++ b/tests/test_serialization.py
@@ -2,128 +2,77 @@
 import io
 import os
 import tempfile
-from pytest import raises
+import pytest
 from omegaconf import OmegaConf
 
 
-def save_load_file_deprecated(conf):
-    try:
-        with tempfile.NamedTemporaryFile(mode="wt", delete=False) as fp:
-            conf.save(fp.file)
-        with io.open(os.path.abspath(fp.name), "rt") as handle:
-            c2 = OmegaConf.load(handle)
-        assert conf == c2
-    finally:
-        os.unlink(fp.name)
-
-
-def save_load_filename(conf):
-    # note that delete=False here is a work around windows incompetence.
-    try:
-        with tempfile.NamedTemporaryFile(delete=False) as fp:
-            conf.save(fp.name)
-            c2 = OmegaConf.load(fp.name)
-            assert conf == c2
-    finally:
-        os.unlink(fp.name)
-
-
-# Test deprecated config.save()
-
-
-def save_load__from_file_deprecated(conf):
-    try:
-        with tempfile.NamedTemporaryFile(mode="wt", delete=False) as fp:
-            conf.save(fp.file)
-        with io.open(os.path.abspath(fp.name), "rt") as handle:
-            c2 = OmegaConf.load(handle)
-        assert conf == c2
-    finally:
-        os.unlink(fp.name)
-
-
-def save_load__from_filename_deprecated(conf):
+def save_load_filename(conf, resolve, expected):
+    if expected is None:
+        expected = conf
     # note that delete=False here is a work around windows incompetence.
     try:
         with tempfile.NamedTemporaryFile(delete=False) as fp:
-            conf.save(fp.name)
+            OmegaConf.save(conf, fp.name, resolve=resolve)
             c2 = OmegaConf.load(fp.name)
-            assert conf == c2
+            assert c2 == expected
     finally:
         os.unlink(fp.name)
 
 
-def test_save_load_file_deprecated():
-    save_load_file_deprecated(OmegaConf.create(dict(a=10)))
-
-
-def test_save_load_filename_deprecated():
-    save_load_filename(OmegaConf.create(dict(a=10)))
-
-
-def test_save_load__from_file_deprecated():
-    save_load__from_file_deprecated(OmegaConf.create(dict(a=10)))
-
-
-def test_save_load__from_filename_deprecated():
-    save_load__from_filename_deprecated(OmegaConf.create(dict(a=10)))
-
-
-def test_save_illegal_type_deprecated():
-    with raises(TypeError):
-        OmegaConf.create().save(1000)
-
-
-##############################################
-# Test OmegaConf.save()
-
-
-def save_load__from_file(conf):
+def save_load_from_file(conf, resolve, expected):
+    if expected is None:
+        expected = conf
     try:
         with tempfile.NamedTemporaryFile(mode="wt", delete=False) as fp:
-            OmegaConf.save(conf, fp.file)
+            OmegaConf.save(conf, fp.file, resolve=resolve)
         with io.open(os.path.abspath(fp.name), "rt") as handle:
             c2 = OmegaConf.load(handle)
-        assert conf == c2
+        assert c2 == expected
     finally:
         os.unlink(fp.name)
 
 
-def save_load__from_filename(conf):
+def save_load_from_filename(conf, resolve, expected):
+    if expected is None:
+        expected = conf
     # note that delete=False here is a work around windows incompetence.
     try:
         with tempfile.NamedTemporaryFile(delete=False) as fp:
-            OmegaConf.save(conf, fp.name)
+            OmegaConf.save(conf, fp.name, resolve=resolve)
             c2 = OmegaConf.load(fp.name)
-            assert conf == c2
+            assert c2 == expected
     finally:
         os.unlink(fp.name)
 
 
-def test_save_load_file():
-    save_load_file_deprecated(OmegaConf.create(dict(a=10)))
-
-
-def test_save_load_filename():
-    save_load_filename(OmegaConf.create(dict(a=10)))
-
+@pytest.mark.parametrize(
+    "cfg,resolve,expected",
+    [
+        (dict(a=10), False, None),
+        ({"foo": 10, "bar": "${foo}"}, False, None),
+        ({"foo": 10, "bar": "${foo}"}, False, {"foo": 10, "bar": 10}),
+        ([u"שלום"], False, None),
+    ],
+)
+class TestSaveLoad:
+    def test_save_load_filename(self, cfg, resolve, expected):
+        cfg = OmegaConf.create(cfg)
+        save_load_filename(cfg, resolve, expected)
 
-def test_save_load__from_file():
-    save_load__from_file(OmegaConf.create(dict(a=10)))
+    def test_save_load__from_file(self, cfg, resolve, expected):
+        cfg = OmegaConf.create(cfg)
+        save_load_from_file(cfg, resolve, expected)
 
-
-def test_save_load__from_filename():
-    save_load__from_filename(OmegaConf.create(dict(a=10)))
+    def test_save_load__from_filename(self, cfg, resolve, expected):
+        cfg = OmegaConf.create(cfg)
+        save_load_from_filename(cfg, resolve, expected)
 
 
 def test_save_illegal_type():
-    with raises(TypeError):
+    with pytest.raises(TypeError):
         OmegaConf.save(OmegaConf.create(), 1000)
 
 
-##############################################
-
-
 def test_pickle_dict():
     with tempfile.TemporaryFile() as fp:
         import pickle
@@ -146,7 +95,3 @@ def test_pickle_list():
         fp.seek(0)
         c1 = pickle.load(fp)
         assert c == c1
-
-
-def test_save_load_unicode():
-    save_load_filename(OmegaConf.create([u"שלום"]))
diff --git a/tests/test_serialization_deprecated_save.py b/tests/test_serialization_deprecated_save.py
new file mode 100644
index 0000000..66357ae
--- /dev/null
+++ b/tests/test_serialization_deprecated_save.py
@@ -0,0 +1,84 @@
+# -*- coding: utf-8 -*-
+import os
+import tempfile
+
+import io
+from pytest import raises
+
+from omegaconf import OmegaConf
+
+
+def save_load_file_deprecated(conf):
+    try:
+        with tempfile.NamedTemporaryFile(mode="wt", delete=False) as fp:
+            conf.save(fp.file)
+        with io.open(os.path.abspath(fp.name), "rt") as handle:
+            c2 = OmegaConf.load(handle)
+        assert conf == c2
+    finally:
+        os.unlink(fp.name)
+
+
+def save_load_filename(conf):
+    # note that delete=False here is a work around windows incompetence.
+    try:
+        with tempfile.NamedTemporaryFile(delete=False) as fp:
+            conf.save(fp.name)
+            c2 = OmegaConf.load(fp.name)
+            assert conf == c2
+    finally:
+        os.unlink(fp.name)
+
+
+# Test deprecated config.save()
+
+
+def save_load__from_file_deprecated(conf):
+    try:
+        with tempfile.NamedTemporaryFile(mode="wt", delete=False) as fp:
+            conf.save(fp.file)
+        with io.open(os.path.abspath(fp.name), "rt") as handle:
+            c2 = OmegaConf.load(handle)
+        assert conf == c2
+    finally:
+        os.unlink(fp.name)
+
+
+def save_load__from_filename_deprecated(conf):
+    # note that delete=False here is a work around windows incompetence.
+    try:
+        with tempfile.NamedTemporaryFile(delete=False) as fp:
+            conf.save(fp.name)
+            c2 = OmegaConf.load(fp.name)
+            assert conf == c2
+    finally:
+        os.unlink(fp.name)
+
+
+def test_save_load_file_deprecated():
+    save_load_file_deprecated(OmegaConf.create(dict(a=10)))
+
+
+def test_save_load_filename_deprecated():
+    save_load_filename(OmegaConf.create(dict(a=10)))
+
+
+def test_save_load__from_file_deprecated():
+    save_load__from_file_deprecated(OmegaConf.create(dict(a=10)))
+
+
+def test_save_load__from_filename_deprecated():
+    save_load__from_filename_deprecated(OmegaConf.create(dict(a=10)))
+
+
+def test_save_illegal_type_deprecated():
+    with raises(TypeError):
+        OmegaConf.create().save(1000)
+
+
+def test_save_load_file():
+    save_load_file_deprecated(OmegaConf.create(dict(a=10)))
+
+
+def test_save_load_filename():
+    save_load_filename(OmegaConf.create(dict(a=10)))

pip install -e .[dev]
parse_log_pytest
pytest
pytest
apt-get update apt-get install -y gcc
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
argcomplete==3.1.2
attrs @ file:///croot/attrs_1668696182826/work
black==23.3.0
bleach==6.0.0
certifi @ file:///croot/certifi_1671487769961/work/certifi
cffi==1.15.1
cfgv==3.3.1
charset-normalizer==3.4.1
click==8.1.8
click-default-group==1.2.4
colorlog==6.9.0
coverage==6.5.0
coveralls==3.3.1
cryptography==44.0.2
distlib==0.3.9
docopt==0.6.2
docutils==0.20.1
filelock==3.12.2
flake8==5.0.4
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
identify==2.5.24
idna==3.10
importlib-metadata==4.2.0
importlib-resources==5.12.0
incremental==22.10.0
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
jaraco.classes==3.2.3
jeepney==0.9.0
Jinja2==3.1.6
keyring==23.9.3
markdown-it-py==2.2.0
MarkupSafe==2.1.5
mccabe==0.7.0
mdurl==0.1.2
more-itertools==9.1.0
mypy-extensions==1.0.0
nodeenv==1.9.1
nox==2024.4.15
-e git+https://github.com/omry/omegaconf.git@4075bea5be38c765d6ec783e5aaf029c5bade43f#egg=omegaconf
packaging @ file:///croot/packaging_1671697413597/work
pathspec==0.11.2
pkginfo==1.10.0
platformdirs==2.6.2
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
pre-commit==2.21.0
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pycodestyle==2.9.1
pycparser==2.21
pyflakes==2.5.0
Pygments==2.17.2
pytest==7.1.2
PyYAML==6.0.1
readme-renderer==37.3
requests==2.31.0
requests-toolbelt==1.0.0
rfc3986==2.0.0
rich==13.8.1
SecretStorage==3.3.3
six==1.17.0
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
towncrier==23.6.0
twine==4.0.2
typed-ast==1.5.5
typing_extensions==4.7.1
urllib3==2.0.7
virtualenv==20.16.2
webencodings==0.5.1
zipp @ file:///croot/zipp_1672387121353/work

name: omegaconf
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - argcomplete==3.1.2
      - black==23.3.0
      - bleach==6.0.0
      - cffi==1.15.1
      - cfgv==3.3.1
      - charset-normalizer==3.4.1
      - click==8.1.8
      - click-default-group==1.2.4
      - colorlog==6.9.0
      - coverage==6.5.0
      - coveralls==3.3.1
      - cryptography==44.0.2
      - distlib==0.3.9
      - docopt==0.6.2
      - docutils==0.20.1
      - filelock==3.12.2
      - flake8==5.0.4
      - identify==2.5.24
      - idna==3.10
      - importlib-metadata==4.2.0
      - importlib-resources==5.12.0
      - incremental==22.10.0
      - jaraco-classes==3.2.3
      - jeepney==0.9.0
      - jinja2==3.1.6
      - keyring==23.9.3
      - markdown-it-py==2.2.0
      - markupsafe==2.1.5
      - mccabe==0.7.0
      - mdurl==0.1.2
      - more-itertools==9.1.0
      - mypy-extensions==1.0.0
      - nodeenv==1.9.1
      - nox==2024.4.15
      - omegaconf==1.4.0rc2
      - pathspec==0.11.2
      - pkginfo==1.10.0
      - platformdirs==2.6.2
      - pre-commit==2.21.0
      - pycodestyle==2.9.1
      - pycparser==2.21
      - pyflakes==2.5.0
      - pygments==2.17.2
      - pyyaml==6.0.1
      - readme-renderer==37.3
      - requests==2.31.0
      - requests-toolbelt==1.0.0
      - rfc3986==2.0.0
      - rich==13.8.1
      - secretstorage==3.3.3
      - six==1.17.0
      - towncrier==23.6.0
      - twine==4.0.2
      - typed-ast==1.5.5
      - typing-extensions==4.7.1
      - urllib3==2.0.7
      - virtualenv==20.16.2
      - webencodings==0.5.1
prefix: /opt/conda/envs/omegaconf

tests/test_serialization.py::TestSaveLoad::test_save_load_filename[cfg0-False-None] tests/test_serialization.py::TestSaveLoad::test_save_load_filename[cfg1-False-None] tests/test_serialization.py::TestSaveLoad::test_save_load_filename[cfg2-False-expected2] tests/test_serialization.py::TestSaveLoad::test_save_load_filename[cfg3-False-None] tests/test_serialization.py::TestSaveLoad::test_save_load__from_file[cfg0-False-None] tests/test_serialization.py::TestSaveLoad::test_save_load__from_file[cfg1-False-None] tests/test_serialization.py::TestSaveLoad::test_save_load__from_file[cfg2-False-expected2] tests/test_serialization.py::TestSaveLoad::test_save_load__from_file[cfg3-False-None] tests/test_serialization.py::TestSaveLoad::test_save_load__from_filename[cfg0-False-None] tests/test_serialization.py::TestSaveLoad::test_save_load__from_filename[cfg1-False-None] tests/test_serialization.py::TestSaveLoad::test_save_load__from_filename[cfg2-False-expected2] tests/test_serialization.py::TestSaveLoad::test_save_load__from_filename[cfg3-False-None]
tests/test_serialization.py::test_save_illegal_type tests/test_serialization.py::test_pickle_dict tests/test_serialization.py::test_pickle_list tests/test_serialization_deprecated_save.py::test_save_load_file_deprecated tests/test_serialization_deprecated_save.py::test_save_load_filename_deprecated tests/test_serialization_deprecated_save.py::test_save_load__from_file_deprecated tests/test_serialization_deprecated_save.py::test_save_load__from_filename_deprecated tests/test_serialization_deprecated_save.py::test_save_illegal_type_deprecated tests/test_serialization_deprecated_save.py::test_save_load_file tests/test_serialization_deprecated_save.py::test_save_load_filename
news/37.feature omegaconf/omegaconf.py
news/37.feature omegaconf/omegaconf.py