diff -ru quickfixj.orig/core/src/main/java/quickfix/DefaultSessionFactory.java quickfixj/core/src/main/java/quickfix/DefaultSessionFactory.java
--- quickfixj.orig/core/src/main/java/quickfix/DefaultSessionFactory.java	2009-02-02 14:31:42.998170600 +0000
+++ quickfixj/core/src/main/java/quickfix/DefaultSessionFactory.java	2009-02-04 17:59:59.343750000 +0000
@@ -153,12 +153,14 @@
             int logonTimeout = getSetting(settings, sessionID, Session.SETTING_LOGON_TIMEOUT, 10);
             int logoutTimeout = getSetting(settings, sessionID, Session.SETTING_LOGOUT_TIMEOUT, 2);
 
+            boolean inferResetAccepted = getSetting(settings, sessionID, Session.SETTING_INFER_RESET_SEQ_NUM_RESET_ACCEPTED, false);
+            
             Session session = new Session(application, messageStoreFactory, sessionID,
                     dataDictionaryProvider, new SessionSchedule(settings, sessionID), logFactory,
                     messageFactory, heartbeatInterval, checkLatency, maxLatency, millisInTimestamp,
                     resetOnLogon, resetOnLogout, resetOnDisconnect, refreshAtLogon,
                     checkCompID, redundantResentRequestAllowed, persistMessages,
-                    useClosedIntervalForResend, testRequestDelayMultiplier, senderDefaultApplVerID);
+                    useClosedIntervalForResend, testRequestDelayMultiplier, senderDefaultApplVerID, inferResetAccepted);
 
             session.setLogonTimeout(logonTimeout);
             session.setLogoutTimeout(logoutTimeout);
diff -ru quickfixj.orig/core/src/main/java/quickfix/Session.java quickfixj/core/src/main/java/quickfix/Session.java
--- quickfixj.orig/core/src/main/java/quickfix/Session.java	2009-02-02 14:31:34.044988300 +0000
+++ quickfixj/core/src/main/java/quickfix/Session.java	2009-02-04 18:05:47.750000000 +0000
@@ -212,6 +212,13 @@
     public static final String SETTING_RESET_ON_LOGON = "ResetOnLogon";
 
     /**
+     * Session setting indicating that a request for a sequence number reset
+     * will be considered to have been accepted when the response has a sequence
+     * number of one, even when ResetSeqNumFlag=Y is missing (QFJ-383).
+     */
+    public static final String SETTING_INFER_RESET_SEQ_NUM_RESET_ACCEPTED = "InferResetSeqNumAccepted";
+    
+    /**
      * Session description. Used by external tools.
      */
     public static final String SETTING_DESCRIPTION = "Description";
@@ -295,6 +302,8 @@
     private final AtomicReference<ApplVerID> targetDefaultApplVerID = new AtomicReference<ApplVerID>();
     private final DefaultApplVerID senderDefaultApplVerID;
 
+    private final boolean inferResetSeqNumAccepted;
+    
     public static final int DEFAULT_MAX_LATENCY = 120;
     public static final double DEFAULT_TEST_REQUEST_DELAY_MULTIPLIER = 0.5;
 
@@ -305,7 +314,7 @@
         this(application, messageStoreFactory, sessionID, dataDictionaryProvider, sessionSchedule,
                 logFactory, messageFactory, heartbeatInterval, true, DEFAULT_MAX_LATENCY, true,
                 false, false, false, false, true, false, true, false,
-                DEFAULT_TEST_REQUEST_DELAY_MULTIPLIER, null);
+                DEFAULT_TEST_REQUEST_DELAY_MULTIPLIER, null, false);
     }
 
     Session(Application application, MessageStoreFactory messageStoreFactory, SessionID sessionID,
@@ -316,7 +325,7 @@
             boolean refreshMessageStoreAtLogon, boolean checkCompID,
             boolean redundantResentRequestsAllowed, boolean persistMessages,
             boolean useClosedRangeForResend, double testRequestDelayMultiplier,
-            DefaultApplVerID senderDefaultApplVerID) {
+            DefaultApplVerID senderDefaultApplVerID, boolean inferResetSeqNumAccepted) {
         this.application = application;
         this.sessionID = sessionID;
         this.sessionSchedule = sessionSchedule;
@@ -334,6 +343,7 @@
         this.persistMessages = persistMessages;
         this.useClosedRangeForResend = useClosedRangeForResend;
         this.senderDefaultApplVerID = senderDefaultApplVerID;
+        this.inferResetSeqNumAccepted = inferResetSeqNumAccepted;
 
         this.state = new SessionState(this, logFactory != null
                 ? logFactory.create(sessionID)
@@ -1557,6 +1567,11 @@
 
         if (logon.isSetField(ResetSeqNumFlag.FIELD)) {
             state.setResetReceived(logon.getBoolean(ResetSeqNumFlag.FIELD));
+        } else if (inferResetSeqNumAccepted) {
+            if (state.isResetSent() && logon.getHeader().getInt(MsgSeqNum.FIELD) == 1) {
+                getLog().onEvent("Inferring ResetSeqNumFlag as sequence number is 1 in response to reset request");
+                state.setResetReceived(true);
+            }
         }
 
         if (state.isResetReceived()) {
diff -ru quickfixj.orig/core/src/test/java/quickfix/SessionFactoryTestSupport.java quickfixj/core/src/test/java/quickfix/SessionFactoryTestSupport.java
--- quickfixj.orig/core/src/test/java/quickfix/SessionFactoryTestSupport.java	2009-02-02 14:30:02.044399500 +0000
+++ quickfixj/core/src/test/java/quickfix/SessionFactoryTestSupport.java	2009-02-02 15:55:24.032933300 +0000
@@ -15,11 +15,11 @@
                 new ScreenLogFactory(true, true, true), new DefaultMessageFactory(), isInitiator ? 30 : 0);
     }
 
-    public static Session createSession(SessionID sessionID, Application application, boolean isInitiator, boolean resetOnLogon) {
+    public static Session createSession(SessionID sessionID, Application application, boolean isInitiator, boolean resetOnLogon, boolean inferReset) {
         return new Session(application, new MemoryStoreFactory(), sessionID, null, null,
                 new ScreenLogFactory(true, true, true), new DefaultMessageFactory(), isInitiator ? 30 : 0,
                         false, 30, true, resetOnLogon, false, false, false, false, false, true, false,
-                        1.5, null);
+                        1.5, null, inferReset);
     }
 
     public static Session createSession() throws ConfigError {
diff -ru quickfixj.orig/core/src/test/java/quickfix/SessionTest.java quickfixj/core/src/test/java/quickfix/SessionTest.java
--- quickfixj.orig/core/src/test/java/quickfix/SessionTest.java	2009-02-02 14:30:03.731910300 +0000
+++ quickfixj/core/src/test/java/quickfix/SessionTest.java	2009-02-04 17:58:50.906250000 +0000
@@ -1,6 +1,7 @@
 package quickfix;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -11,7 +12,6 @@
 import java.util.Date;
 
 import org.junit.Test;
-
 import quickfix.field.BeginString;
 import quickfix.field.EncryptMethod;
 import quickfix.field.Headline;
@@ -38,7 +38,65 @@
         Application application = new UnitTestApplication();
         
         SessionID sessionID = new SessionID(FixVersions.BEGINSTRING_FIX44, "SENDER", "TARGET");
-        Session session = createSession(sessionID, application, true, true);
+        Session session = createSession(sessionID, application, true, true, false);
+        
+        UnitTestResponder responder = new UnitTestResponder();
+        session.setResponder(responder);
+
+        session.logon();
+        session.next();
+        
+        Message logonRequest = new Message(responder.sentMessageData);
+        Message logonResponse = new DefaultMessageFactory().create(sessionID.getBeginString(), MsgType.LOGON);
+        logonResponse.setInt(EncryptMethod.FIELD, EncryptMethod.NONE_OTHER);
+        logonResponse.setInt(HeartBtInt.FIELD, logonRequest.getInt(HeartBtInt.FIELD));
+        Message.Header header = logonResponse.getHeader();
+        header.setString(BeginString.FIELD, sessionID.getBeginString());
+        header.setString(SenderCompID.FIELD, sessionID.getSenderCompID());
+        header.setString(TargetCompID.FIELD, sessionID.getTargetCompID());
+        header.setInt(MsgSeqNum.FIELD, 1);
+        header.setUtcTimeStamp(SendingTime.FIELD, SystemTime.getDate(), true);
+        session.next(logonResponse);
+        
+        assertTrue("Disconnect called", responder.disconnectCalled);
+    }
+
+    @Test
+    public void testInferResetSeqNumAcceptedWithNonInitialSequenceNumber() throws Exception {
+
+        Application application = new UnitTestApplication();
+        
+        SessionID sessionID = new SessionID(FixVersions.BEGINSTRING_FIX44, "SENDER", "TARGET");
+        Session session = createSession(sessionID, application, true, true, true);
+        
+        UnitTestResponder responder = new UnitTestResponder();
+        session.setResponder(responder);
+
+        session.logon();
+        session.next();
+        
+        Message logonRequest = new Message(responder.sentMessageData);
+        Message logonResponse = new DefaultMessageFactory().create(sessionID.getBeginString(), MsgType.LOGON);
+        logonResponse.setInt(EncryptMethod.FIELD, EncryptMethod.NONE_OTHER);
+        logonResponse.setInt(HeartBtInt.FIELD, logonRequest.getInt(HeartBtInt.FIELD));
+        Message.Header header = logonResponse.getHeader();
+        header.setString(BeginString.FIELD, sessionID.getBeginString());
+        header.setString(SenderCompID.FIELD, sessionID.getSenderCompID());
+        header.setString(TargetCompID.FIELD, sessionID.getTargetCompID());
+        header.setInt(MsgSeqNum.FIELD, 2);
+        header.setUtcTimeStamp(SendingTime.FIELD, SystemTime.getDate(), true);
+        session.next(logonResponse);
+        
+        assertTrue("Should not infer a reset when the sequence number is not one", responder.disconnectCalled);
+    }
+
+    @Test
+    public void testInferResetSeqNumAccepted() throws Exception {
+
+        Application application = new UnitTestApplication();
+        
+        SessionID sessionID = new SessionID(FixVersions.BEGINSTRING_FIX44, "SENDER", "TARGET");
+        Session session = createSession(sessionID, application, true, true, true);
         
         UnitTestResponder responder = new UnitTestResponder();
         session.setResponder(responder);
@@ -58,7 +116,8 @@
         header.setUtcTimeStamp(SendingTime.FIELD, SystemTime.getDate(), true);
         session.next(logonResponse);
         
-        assertTrue("Disconnect not called", responder.disconnectCalled);
+        assertFalse("Should not disconnect when an accepted reset is inferred",
+                        responder.disconnectCalled);
     }
 
     // QFJ-60
