diff --git a/ChangeLog b/ChangeLog
index 7ab3f9655b40ac7cdd79c8a46e96b4ee46f89730..92390b461be100b210fd1ed6a191ff5ab7ff1441 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,7 @@
 Changes in version 0.0.7 - UNRELEASED:
+ - Support configuring the obfs4 IAT parameter as the sole
+   ServerTransportOption on bridges, and correctly checkpoint the argument
+   to the state file.
 
 Changes in version 0.0.6 - 2016-01-25:
  - Delay transport factory initialization till after logging has been
diff --git a/transports/obfs4/statefile.go b/transports/obfs4/statefile.go
index 6c34f35071ad09cd0f28ac2067b653659e2f8b12..e4ff8bfa7c8e2a3392435f1c8d238e6158d2d34a 100644
--- a/transports/obfs4/statefile.go
+++ b/transports/obfs4/statefile.go
@@ -119,7 +119,9 @@ func serverStateFromArgs(stateDir string, args *pt.Args) (*obfs4ServerState, err
 	js.DrbgSeed, seedOk = args.Get(seedArg)
 	iatStr, iatOk := args.Get(iatArg)
 
-	if !privKeyOk && !nodeIDOk && !seedOk && !iatOk {
+	// Either a private key, node id, and seed are ALL specified, or
+	// they should be loaded from the state file.
+	if !privKeyOk && !nodeIDOk && !seedOk {
 		if err := jsonServerStateFromFile(stateDir, &js); err != nil {
 			return nil, err
 		}
@@ -129,11 +131,12 @@ func serverStateFromArgs(stateDir string, args *pt.Args) (*obfs4ServerState, err
 		return nil, fmt.Errorf("missing argument '%s'", nodeIDArg)
 	} else if !seedOk {
 		return nil, fmt.Errorf("missing argument '%s'", seedArg)
-	} else if !iatOk {
-		// Disable IAT if not specified.
-		return nil, fmt.Errorf("missing argument '%s'", iatArg)
-	} else {
-		// Parse and validate the iat-mode argument.
+	}
+
+	// The IAT mode should be independently configurable.
+	if iatOk {
+		// If the IAT mode is specified, attempt to parse and apply it
+		// as an override.
 		iatMode, err := strconv.Atoi(iatStr)
 		if err != nil {
 			return nil, fmt.Errorf("malformed iat-mode '%s'", iatStr)
@@ -168,7 +171,8 @@ func serverStateFromJSONServerState(stateDir string, js *jsonServerState) (*obfs
 		return nil, err
 	}
 
-	return st, nil
+	// Write back the possibly updated server state.
+	return st, writeJSONServerState(stateDir, js)
 }
 
 func jsonServerStateFromFile(stateDir string, js *jsonServerState) error {
@@ -215,11 +219,15 @@ func newJSONServerState(stateDir string, js *jsonServerState) (err error) {
 	js.DrbgSeed = st.drbgSeed.Hex()
 	js.IATMode = st.iatMode
 
+	return writeJSONServerState(stateDir, js)
+}
+
+func writeJSONServerState(stateDir string, js *jsonServerState) error {
+	var err error
 	var encoded []byte
 	if encoded, err = json.Marshal(js); err != nil {
-		return
+		return err
 	}
-
 	if err = ioutil.WriteFile(path.Join(stateDir, stateFile), encoded, 0600); err != nil {
 		return err
 	}