diff --git a/tensorflow/python/BUILD b/tensorflow/python/BUILD
index 9b89a32e345..d5417498838 100644
--- a/tensorflow/python/BUILD
+++ b/tensorflow/python/BUILD
@@ -329,59 +329,112 @@ cc_library(
     deps = [":python_op_gen"],
 )
 
-# What is needed for tf_gen_op_wrapper_py.
 py_library(
     name = "framework_for_generated_wrappers",
-    srcs = [
-        "framework/constant_op.py",
-        "framework/device.py",
-        "framework/dtypes.py",
-        "framework/function.py",
-        "framework/op_def_library.py",
-        "framework/op_def_registry.py",
-        "framework/ops.py",
-        "framework/registry.py",
-        "framework/tensor_shape.py",
-        "framework/versions.py",
-    ],
     srcs_version = "PY2AND3",
     visibility = ["//visibility:public"],
     deps = [
-        ":platform",
-        ":util",
-        "//tensorflow/core:protos_all_py",
-        "//third_party/py/numpy",
-        "@six_archive//:six",
+        ":constant_op",
+        ":device",
+        ":dtypes",
+        ":framework_ops",
+        ":function",
+        ":op_def_library",
+        ":op_def_registry",
+        ":registry",
+        ":tensor_shape",
+        ":versions",
+    ],
+)
+
+# What is needed for tf_gen_op_wrapper_py. This is the same as
+# "framework_for_generated_wrappers" minus the "function" dep. This is to avoid
+# circular dependencies, as "function" uses generated op wrappers.
+py_library(
+    name = "framework_for_generated_wrappers_v2",
+    srcs_version = "PY2AND3",
+    visibility = ["//visibility:public"],
+    deps = [
+        ":constant_op",
+        ":device",
+        ":dtypes",
+        ":framework_ops",
+        ":op_def_library",
+        ":op_def_registry",
+        ":registry",
+        ":tensor_shape",
+        ":versions",
     ],
 )
 
 py_library(
     name = "framework",
     srcs = [
-        "framework/common_shapes.py",
         "framework/framework_lib.py",
         "framework/graph_io.py",
-        "framework/graph_util.py",
-        "framework/graph_util_impl.py",
         "framework/importer.py",
         "framework/load_library.py",
         "framework/meta_graph.py",
-        "framework/random_seed.py",
-        "framework/sparse_tensor.py",
         "framework/subscribe.py",
-        "framework/tensor_util.py",
     ],
     srcs_version = "PY2AND3",
+    deps = [
+        ":common_shapes",
+        ":cpp_shape_inference_proto_py",
+        ":errors",
+        ":framework_for_generated_wrappers",
+        ":graph_util",
+        ":lib",
+        ":platform",
+        ":pywrap_tensorflow",
+        ":random_seed",
+        ":sparse_tensor",
+        ":tensor_util",
+        ":util",
+        "//third_party/py/numpy",
+        "@six_archive//:six",
+    ],
+)
+
+py_library(
+    name = "common_shapes",
+    srcs = ["framework/common_shapes.py"],
+    srcs_version = "PY2AND3",
     deps = [
         ":cpp_shape_inference_proto_py",
         ":errors",
-        ":framework_for_generated_wrappers",
-        ":lib",
-        ":platform",
+        ":framework_ops",
         ":pywrap_tensorflow",
-        ":util",
-        "//third_party/py/numpy",
-        "@six_archive//:six",
+        ":tensor_shape",
+        ":tensor_util",
+        "//tensorflow/core:protos_all_py",
+    ],
+)
+
+py_library(
+    name = "constant_op",
+    srcs = ["framework/constant_op.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        ":dtypes",
+        ":framework_ops",
+        ":tensor_shape",
+        "//tensorflow/core:protos_all_py",
+    ],
+)
+
+py_library(
+    name = "device",
+    srcs = ["framework/device.py"],
+    srcs_version = "PY2AND3",
+)
+
+py_library(
+    name = "dtypes",
+    srcs = ["framework/dtypes.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        "//tensorflow/core:protos_all_py",
     ],
 )
 
@@ -395,6 +448,139 @@ py_library(
     deps = [":util"],
 )
 
+py_library(
+    name = "function",
+    srcs = ["framework/function.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        ":array_ops",
+        ":dtypes",
+        ":framework_ops",
+        ":op_def_registry",
+        ":util",
+        ":variable_scope",
+        "//tensorflow/core:protos_all_py",
+    ],
+)
+
+py_library(
+    name = "graph_util",
+    srcs = [
+        "framework/graph_util.py",
+        "framework/graph_util_impl.py",
+    ],
+    srcs_version = "PY2AND3",
+    deps = [
+        ":dtypes",
+        ":framework_ops",
+        ":platform",
+        ":tensor_util",
+        "//tensorflow/core:protos_all_py",
+    ],
+)
+
+py_library(
+    name = "op_def_library",
+    srcs = ["framework/op_def_library.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        ":dtypes",
+        ":framework_ops",
+        ":platform",
+        ":tensor_shape",
+        ":util",
+        "//tensorflow/core:protos_all_py",
+        "@six_archive//:six",
+    ],
+)
+
+py_library(
+    name = "op_def_registry",
+    srcs = ["framework/op_def_registry.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        "//tensorflow/core:protos_all_py",
+    ],
+)
+
+py_library(
+    name = "framework_ops",  # "ops" is already the name of a deprecated target
+    srcs = ["framework/ops.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        ":device",
+        ":dtypes",
+        ":op_def_registry",
+        ":platform",
+        ":registry",
+        ":tensor_shape",
+        ":util",
+        ":versions",
+        "//tensorflow/core:protos_all_py",
+        "@six_archive//:six",
+    ],
+)
+
+py_library(
+    name = "random_seed",
+    srcs = ["framework/random_seed.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        ":framework_ops",
+    ],
+)
+
+py_library(
+    name = "registry",
+    srcs = ["framework/registry.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        ":platform",
+        ":util",
+    ],
+)
+
+py_library(
+    name = "sparse_tensor",
+    srcs = ["framework/sparse_tensor.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        ":dtypes",
+        ":framework_ops",
+        ":tensor_util",
+    ],
+)
+
+py_library(
+    name = "tensor_shape",
+    srcs = ["framework/tensor_shape.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        ":util",
+        "//tensorflow/core:protos_all_py",
+    ],
+)
+
+py_library(
+    name = "tensor_util",
+    srcs = ["framework/tensor_util.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        ":tensor_shape",
+        ":util",
+        "//tensorflow/core:protos_all_py",
+    ],
+)
+
+py_library(
+    name = "versions",
+    srcs = ["framework/versions.py"],
+    srcs_version = "PY2AND3",
+    deps = [
+        ":pywrap_tensorflow",
+    ],
+)
+
 # load("//third_party/py/cython:build_defs.bzl", "pyx_library")
 
 py_library(
@@ -514,11 +700,13 @@ py_library(
     srcs_version = "PY2AND3",
     deps = [
         ":array_ops",
+        ":constant_op",
         ":control_flow_ops",
-        ":framework",
-        ":framework_for_generated_wrappers",
+        ":framework_ops",
         ":functional_ops_gen",
+        ":sparse_tensor",
         ":tensor_array_ops",
+        ":tensor_shape",
         ":util",
         ":variable_scope",
     ],
@@ -997,9 +1185,14 @@ py_library(
     srcs_version = "PY2AND3",
     deps = [
         ":array_ops_gen",
-        ":framework",
-        ":framework_for_generated_wrappers",
+        ":common_shapes",
+        ":constant_op",
+        ":dtypes",
+        ":framework_ops",
         ":math_ops_gen",
+        ":sparse_tensor",
+        ":tensor_shape",
+        ":tensor_util",
         ":util",
         "//third_party/py/numpy",
         "@six_archive//:six",
@@ -1079,17 +1272,21 @@ py_library(
     srcs = ["ops/control_flow_ops.py"],
     srcs_version = "PY2AND3",
     deps = [
+        "tensor_shape",
         ":array_ops",
         ":array_ops_gen",
+        ":constant_op",
         ":control_flow_ops_gen",
         ":data_flow_ops_gen",
-        ":framework",
-        ":framework_for_generated_wrappers",
+        ":dtypes",
+        ":framework_ops",
         ":logging_ops_gen",
         ":math_ops",
         ":platform",
+        ":sparse_tensor",
         ":tensor_array_ops",
         ":util",
+        "//tensorflow/core:protos_all_py",
         "@six_archive//:six",
     ],
 )
@@ -1232,7 +1429,8 @@ py_library(
     srcs_version = "PY2AND3",
     deps = [
         ":array_ops",
-        ":framework_for_generated_wrappers",
+        ":constant_op",
+        ":dtypes",
         ":linalg_ops",
         ":math_ops",
         ":nn_ops",
@@ -1270,7 +1468,8 @@ py_library(
     srcs_version = "PY2AND3",
     deps = [
         ":array_ops",
-        ":framework_for_generated_wrappers",
+        ":dtypes",
+        ":framework_ops",
         ":linalg_ops_gen",
         ":math_ops",
         "//third_party/py/numpy",
@@ -1308,15 +1507,20 @@ py_library(
     srcs = ["ops/math_ops.py"],
     srcs_version = "PY2AND3",
     deps = [
+        "constant_op",
         ":array_ops",
+        ":common_shapes",
         ":control_flow_ops_gen",
         ":data_flow_ops_gen",
-        ":framework",
-        ":framework_for_generated_wrappers",
+        ":dtypes",
+        ":framework_ops",
+        ":graph_util",
         ":math_ops_gen",
         ":sparse_ops_gen",
+        ":sparse_tensor",
         ":state_ops",
         ":state_ops_gen",
+        ":tensor_shape",
         ":util",
         "//third_party/py/numpy",
     ],
@@ -1340,10 +1544,12 @@ py_library(
     srcs_version = "PY2AND3",
     deps = [
         ":array_ops",
-        ":framework_for_generated_wrappers",
+        ":framework_ops",
         ":resource_variable_ops_gen",
+        ":tensor_shape",
         ":util",
         ":variables",
+        "//tensorflow/core:protos_all_py",
     ],
 )
 
@@ -1390,11 +1596,14 @@ py_library(
     srcs_version = "PY2AND3",
     deps = [
         ":array_ops",
-        ":framework",
-        ":framework_for_generated_wrappers",
+        ":dtypes",
+        ":framework_ops",
+        ":graph_util",
         ":math_ops",
         ":nn_ops_gen",
         ":random_ops",
+        ":tensor_shape",
+        ":tensor_util",
         "//third_party/py/numpy",
     ],
 )
@@ -1443,10 +1652,11 @@ py_library(
     deps = [
         ":array_ops",
         ":control_flow_ops",
-        ":framework",
-        ":framework_for_generated_wrappers",
+        ":dtypes",
+        ":framework_ops",
         ":math_ops",
         ":random_ops_gen",
+        ":random_seed",
     ],
 )
 
@@ -1669,9 +1879,10 @@ py_library(
     srcs = ["ops/state_ops.py"],
     srcs_version = "PY2AND3",
     deps = [
-        ":framework_for_generated_wrappers",
+        ":framework_ops",
         ":resource_variable_ops_gen",
         ":state_ops_gen",
+        ":tensor_shape",
     ],
 )
 
@@ -1726,9 +1937,10 @@ py_library(
     deps = [
         ":array_ops",
         ":data_flow_ops_gen",
-        ":framework",
-        ":framework_for_generated_wrappers",
+        ":framework_ops",
         ":math_ops",
+        ":tensor_shape",
+        ":tensor_util",
         ":util",
     ],
 )
@@ -1738,11 +1950,12 @@ py_library(
     srcs = ["ops/variable_scope.py"],
     srcs_version = "PY2AND3",
     deps = [
-        ":array_ops",
-        ":framework_for_generated_wrappers",
+        ":dtypes",
+        ":framework_ops",
         ":init_ops",
         ":platform",
         ":resource_variable_ops",
+        ":tensor_shape",
         ":variables",
         "@six_archive//:six",
     ],
@@ -1755,10 +1968,13 @@ py_library(
     deps = [
         ":array_ops",
         ":control_flow_ops",
-        ":framework_for_generated_wrappers",
+        ":dtypes",
+        ":framework_ops",
         ":math_ops",
         ":state_ops",
+        ":tensor_shape",
         ":util",
+        "//tensorflow/core:protos_all_py",
     ],
 )
 
diff --git a/tensorflow/tensorflow.bzl b/tensorflow/tensorflow.bzl
index 33c4ff5c3d1..cb6b43b6251 100644
--- a/tensorflow/tensorflow.bzl
+++ b/tensorflow/tensorflow.bzl
@@ -328,7 +328,7 @@ def tf_gen_op_wrapper_py(name, out=None, hidden=None, visibility=None, deps=[],
                     srcs_version="PY2AND3",
                     visibility=visibility,
                     deps=[
-                        "//tensorflow/python:framework_for_generated_wrappers",
+                        "//tensorflow/python:framework_for_generated_wrappers_v2",
                     ],)
 
 # Define a bazel macro that creates cc_test for tensorflow.