diff --git a/Samples/2a-arm-validation/shell/stderr.txt b/Samples/2a-arm-validation/shell/stderr.txt
index eab7b3ea24..4ba27b5e18 100644
--- a/Samples/2a-arm-validation/shell/stderr.txt
+++ b/Samples/2a-arm-validation/shell/stderr.txt
@@ -32,6 +32,8 @@ WARNING (BodyParametersValidation/M2063/SDKViolation): A body parameter must be
 WARNING (BodyParametersValidation/M2063/SDKViolation): A body parameter must be named 'parameters'.
     - https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2015-06-15/swagger/storage.json:382:12 ($.paths["/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}/regenerateKey"].post.parameters[2].name)
     - https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2015-06-15/swagger/storage.json:381:10 ($.paths["/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}/regenerateKey"].post.parameters[2])
+WARNING (OperationIdNounConflictingModelNames/M2063/SDKViolation): OperationId has a noun that conflicts with one of the model names in definitions section. The model name will be disambiguated to 'UsageModel'. Consider using the plural form of 'Usage' to avoid this.
+    - https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2015-06-15/swagger/storage.json:412:8 ($.paths["/subscriptions/{subscriptionId}/providers/Microsoft.Storage/usages"].get.operationId)
 WARNING (DescriptionMissing/M4000/SDKViolation): 'StorageAccountCheckNameAvailabilityParameters' model/property lacks 'description' property. Consider adding a 'description' element. Accurate description is essential for maintaining reference documentation.
     - https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2015-06-15/swagger/storage.json:437:4 ($.definitions.StorageAccountCheckNameAvailabilityParameters)
 WARNING (DescriptionMissing/M4000/SDKViolation): 'StorageAccountPropertiesCreateParameters' model/property lacks 'description' property. Consider adding a 'description' element. Accurate description is essential for maintaining reference documentation.
diff --git a/Samples/2b-suppressions/shell/stderr.txt b/Samples/2b-suppressions/shell/stderr.txt
index 579848df37..3901b42259 100644
--- a/Samples/2b-suppressions/shell/stderr.txt
+++ b/Samples/2b-suppressions/shell/stderr.txt
@@ -32,6 +32,8 @@ WARNING (BodyParametersValidation/M2063/SDKViolation): A body parameter must be
 WARNING (BodyParametersValidation/M2063/SDKViolation): A body parameter must be named 'parameters'.
     - https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2015-06-15/swagger/storage.json:382:12 ($.paths["/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}/regenerateKey"].post.parameters[2].name)
     - https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2015-06-15/swagger/storage.json:381:10 ($.paths["/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}/regenerateKey"].post.parameters[2])
+WARNING (OperationIdNounConflictingModelNames/M2063/SDKViolation): OperationId has a noun that conflicts with one of the model names in definitions section. The model name will be disambiguated to 'UsageModel'. Consider using the plural form of 'Usage' to avoid this.
+    - https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2015-06-15/swagger/storage.json:412:8 ($.paths["/subscriptions/{subscriptionId}/providers/Microsoft.Storage/usages"].get.operationId)
 WARNING (DescriptionMissing/M4000/SDKViolation): 'StorageAccountCheckNameAvailabilityParameters' model/property lacks 'description' property. Consider adding a 'description' element. Accurate description is essential for maintaining reference documentation.
     - https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2015-06-15/swagger/storage.json:437:4 ($.definitions.StorageAccountCheckNameAvailabilityParameters)
 WARNING (DescriptionMissing/M4000/SDKViolation): 'StorageAccountPropertiesCreateParameters' model/property lacks 'description' property. Consider adding a 'description' element. Accurate description is essential for maintaining reference documentation.
diff --git a/Samples/3b-custom-transformations/shell/stderr.txt b/Samples/3b-custom-transformations/shell/stderr.txt
index 6cb2e9554d..90e52eed57 100644
--- a/Samples/3b-custom-transformations/shell/stderr.txt
+++ b/Samples/3b-custom-transformations/shell/stderr.txt
@@ -32,6 +32,8 @@ WARNING (BodyParametersValidation/M2063/SDKViolation): A body parameter must be
 WARNING (BodyParametersValidation/M2063/SDKViolation): A body parameter must be named 'parameters'.
     - https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2015-06-15/swagger/storage.json:382:12 ($.paths["/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}/regenerateKey"].post.parameters[2].name)
     - https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2015-06-15/swagger/storage.json:381:10 ($.paths["/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/{accountName}/regenerateKey"].post.parameters[2])
+WARNING (OperationIdNounConflictingModelNames/M2063/SDKViolation): OperationId has a noun that conflicts with one of the model names in definitions section. The model name will be disambiguated to 'UsageModel'. Consider using the plural form of 'Usage' to avoid this.
+    - mem:///composite-transform/transform_1.yaml:undefined:undefined ($.paths["/subscriptions/{subscriptionId}/providers/Microsoft.Storage/usages"].get.operationId)
 WARNING (DescriptionMissing/M4000/SDKViolation): 'StorageAccountCheckNameAvailabilityParameters' model/property lacks 'description' property. Consider adding a 'description' element. Accurate description is essential for maintaining reference documentation.
     - https://raw.githubusercontent.com/Azure/azure-rest-api-specs/master/arm-storage/2015-06-15/swagger/storage.json:437:4 ($.definitions.StorageAccountCheckNameAvailabilityParameters)
 WARNING (DescriptionMissing/M4000/SDKViolation): 'StorageAccountPropertiesCreateParameters' model/property lacks 'description' property. Consider adding a 'description' element. Accurate description is essential for maintaining reference documentation.
diff --git a/src/core/AutoRest.Core/Properties/Resources.Designer.cs b/src/core/AutoRest.Core/Properties/Resources.Designer.cs
index e9e3cd7c96..cd39ea3e87 100644
--- a/src/core/AutoRest.Core/Properties/Resources.Designer.cs
+++ b/src/core/AutoRest.Core/Properties/Resources.Designer.cs
@@ -125,7 +125,7 @@ public static string BodyPropertyNameCamelCase {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Booleans are not descriptive and make them hard to use. Instead use string enums with allowed set of values defined: &apos;{0}&apos;..
+        ///   Looks up a localized string similar to Booleans are not descriptive and make them hard to use. Instead use string enums with allowed set of values defined..
         /// </summary>
         public static string BooleanPropertyNotRecommended {
             get {
@@ -421,6 +421,15 @@ public static string OperationIdMissing {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to OperationId has a noun that conflicts with one of the model names in definitions section. The model name will be disambiguated to &apos;{0}Model&apos;. Consider using the plural form of &apos;{1}&apos; to avoid this..
+        /// </summary>
+        public static string OperationIdNounConflictingModelNamesMessage {
+            get {
+                return ResourceManager.GetString("OperationIdNounConflictingModelNamesMessage", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Per the Noun_Verb convention for Operation Ids, the noun &apos;{0}&apos; should not appear after the underscore..
         /// </summary>
diff --git a/src/core/AutoRest.Core/Properties/Resources.resx b/src/core/AutoRest.Core/Properties/Resources.resx
index bbf0d31967..dbd8ff9564 100644
--- a/src/core/AutoRest.Core/Properties/Resources.resx
+++ b/src/core/AutoRest.Core/Properties/Resources.resx
@@ -349,6 +349,9 @@ Modelers:
   <data name="ParametersPropertiesValidation" xml:space="preserve">
     <value>Parameter Must have the "name" property defined with non-empty string as its value</value>
   </data>
+  <data name="OperationIdNounConflictingModelNamesMessage" xml:space="preserve">
+    <value>OperationId has a noun that conflicts with one of the model names in definitions section. The model name will be disambiguated to '{0}Model'. Consider using the plural form of '{1}' to avoid this.</value>
+  </data>
   <data name="PutOperationRequestResponseSchemaMessage" xml:space="preserve">
     <value>A PUT operation request body schema should be the same as its 200 response schema, to allow reusing the same entity between GET and PUT. If the schema of the PUT request body is a superset of the GET response body, make sure you have a PATCH operation to make the resource updatable. Operation: '{0}' Request Model: '{1}' Response Model: '{2}'</value>
   </data>
diff --git a/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/Validation/operationid-noun-conflicting-model.json b/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/Validation/operationid-noun-conflicting-model.json
new file mode 100644
index 0000000000..c9d78418ae
--- /dev/null
+++ b/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/Validation/operationid-noun-conflicting-model.json
@@ -0,0 +1,57 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "title": "Microsoft Azure Redis Cache Management API",
+    "description": "Some cool documentation.",
+    "version": "2014-04-01-preview"
+  },
+  "host": "management.azure.com",
+  "schemes": [
+    "https"
+  ],
+  "basePath": "/",
+  "produces": [ "application/json" ],
+  "consumes": [ "application/json" ],
+  "paths": {
+    "/foo": {
+      "get": {
+        "operationId": "Model_Get",
+        "description": "gets a model",
+        "parameters": [
+        ],
+        "responses": {
+          "200": {
+            "schema": {
+              "$ref": "#/definitions/Model"
+            }
+          }
+        }
+      }
+    }
+  },
+  "definitions": {
+    "Model": {
+      "properties": {
+        "prop1": {
+          "type": "string"
+        }
+      }
+    }
+  },
+  "parameters": {
+    "SubscriptionIdParamterer": {
+      "name": "subscriptionId",
+      "in": "path",
+      "description": "Subscription ID.",
+      "required": true,
+      "type": "string"
+    },
+    "ApiVersionParameter": {
+      "name": "apiVersion",
+      "in": "path",
+      "description": "API ID.",
+      "required": true,
+      "type": "string"
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/Validation/positive/clean-complex-spec.json b/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/Validation/positive/clean-complex-spec.json
index 3dd0a5fd66..1c5df9464a 100644
--- a/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/Validation/positive/clean-complex-spec.json
+++ b/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/Validation/positive/clean-complex-spec.json
@@ -175,7 +175,7 @@
     },
     "/foo": {
       "get": {
-        "operationId": "Foo_Get",
+        "operationId": "Foos_Get",
         "x-ms-examples": {
           "The foo we get": {
 
@@ -189,7 +189,7 @@
         }
       },
       "post": {
-        "operationId": "Foo_Post",
+        "operationId": "Foos_Post",
         "description": "foo",
         "x-ms-examples": {
           "The foo we post": {
@@ -221,7 +221,7 @@
   "x-ms-paths": {
     "/foo?overload=true": {
       "post": {
-        "operationId": "Foo_PostOverload",
+        "operationId": "Foos_PostOverload",
         "description": "foo",
         "x-ms-examples": {
           "The foo we post": {
diff --git a/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/Validation/positive/collection-objects-naming-valid.json b/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/Validation/positive/collection-objects-naming-valid.json
index a48e7fdd72..4a6b80f405 100644
--- a/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/Validation/positive/collection-objects-naming-valid.json
+++ b/src/modeler/AutoRest.Swagger.Tests/Resource/Swagger/Validation/positive/collection-objects-naming-valid.json
@@ -45,7 +45,7 @@
           "200": {
             "description": "OK",
             "schema": {
-              "$ref": "#/definitions/Models"
+              "$ref": "#/definitions/ModelsCollection"
             }
           }
         }
@@ -100,7 +100,7 @@
           "200": {
             "description": "OK",
             "schema": {
-              "$ref": "#/definitions/Models"
+              "$ref": "#/definitions/ModelsCollection"
             }
           }
         },
@@ -140,7 +140,7 @@
     }
   },
   "definitions": {
-    "Models": {
+    "ModelsCollection": {
       "description": "the models to return",
       "properties": {
         "value": {
diff --git a/src/modeler/AutoRest.Swagger.Tests/SwaggerModelerValidationTests.cs b/src/modeler/AutoRest.Swagger.Tests/SwaggerModelerValidationTests.cs
index ad94ca4190..53285dd7bb 100644
--- a/src/modeler/AutoRest.Swagger.Tests/SwaggerModelerValidationTests.cs
+++ b/src/modeler/AutoRest.Swagger.Tests/SwaggerModelerValidationTests.cs
@@ -593,6 +593,13 @@ public void EmptyParameterNameValidation()
             messages.AssertOnlyValidationMessage(typeof(ParameterNameValidation), 2);
         }
 
+        [Fact]
+        public void OperationIdNounConflictingModelNameValidationTest()
+        {
+            var messages = ValidateSwagger(Path.Combine(Core.Utilities.Extensions.CodeBaseDirectory, "Resource", "Swagger", "Validation", "operationid-noun-conflicting-model.json"));
+            messages.AssertOnlyValidationMessage(typeof(OperationIdNounConflictingModelNames), 1);
+        }
+
         [Fact]
         public void PutRequestResponseBodySchemaValidation()
         {
diff --git a/src/modeler/AutoRest.Swagger/Model/Operation.cs b/src/modeler/AutoRest.Swagger/Model/Operation.cs
index 94c13abd90..501253ff53 100644
--- a/src/modeler/AutoRest.Swagger/Model/Operation.cs
+++ b/src/modeler/AutoRest.Swagger/Model/Operation.cs
@@ -40,6 +40,7 @@ public Operation()
         [Rule(typeof(PutOperationNameValidation))]
         [Rule(typeof(PatchOperationNameValidation))]
         [Rule(typeof(DeleteOperationNameValidation))]
+        [Rule(typeof(OperationIdNounConflictingModelNames))]
         public string OperationId { get; set; }
 
         public string Summary
diff --git a/src/modeler/AutoRest.Swagger/Validation/OperationIdNounConflictingModelNames.cs b/src/modeler/AutoRest.Swagger/Validation/OperationIdNounConflictingModelNames.cs
new file mode 100644
index 0000000000..3408ce03ed
--- /dev/null
+++ b/src/modeler/AutoRest.Swagger/Validation/OperationIdNounConflictingModelNames.cs
@@ -0,0 +1,72 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See License.txt in the project root for license information.
+
+using System;
+using System.Linq;
+using System.Text.RegularExpressions;
+using AutoRest.Core.Logging;
+using AutoRest.Core.Properties;
+using AutoRest.Swagger.Model;
+using AutoRest.Swagger.Validation.Core;
+
+namespace AutoRest.Swagger.Validation
+{
+    public class OperationIdNounConflictingModelNames : TypedRule<string>
+    {
+        private readonly Regex NounVerbPattern = new Regex("^(?<noun>\\w+)?_(\\w+)$");
+
+        /// <summary>
+        /// Id of the Rule.
+        /// </summary>
+        public override string Id => "M2063";
+
+        /// <summary>
+        /// Violation category of the Rule.
+        /// </summary>
+        public override ValidationCategory ValidationCategory => ValidationCategory.SDKViolation;
+
+        /// <summary>
+        /// Check if the noun part of an operationId (Noun_Verb) conflicts with any model names provided in the spec
+        /// </summary>
+        /// <param name="entity">The operation id to test</param>
+        /// <param name="formatParameters">The noun to be put in the failure message</param>
+        /// <returns></returns>
+        public override bool IsValid(string entity, RuleContext context, out object[] formatParameters)
+        {
+            var match = NounVerbPattern.Match(entity);
+            formatParameters = new object[] { };
+
+            // if operationId does not match the pattern, return true and let some other validation handle it
+            if (!match.Success)
+            {
+                return true;
+            }
+
+            // Get the noun and verb parts of the operation id
+            var noun = match.Groups["noun"].Value;
+
+            var serviceDefinition = (ServiceDefinition)context.Root;
+            if (serviceDefinition.Definitions.Keys.Any(key => key.ToLower().Equals(noun.ToLower())))
+            {
+                formatParameters = new object[] { noun, noun };
+                return false;
+            }
+
+            return true;
+        }
+
+        /// <summary>
+        /// The template message for this Rule. 
+        /// </summary>
+        /// <remarks>
+        /// This may contain placeholders '{0}' for parameterized messages.
+        /// </remarks>
+        public override string MessageTemplate => Resources.OperationIdNounConflictingModelNamesMessage;
+
+        /// <summary>
+        /// The severity of this message (ie, debug/info/warning/error/fatal, etc)
+        /// </summary>
+        public override Category Severity => Category.Warning;
+
+    }
+}